1.讲一下线程之间的通信
a. 把数据设置成线程对象的成员变量
b. 通过主线程的静态的回调函数
c. 使用中间方,消息队列
2.讲一下线程的五种状态
大致分为创建、可运行、运行、阻塞、销毁等五个状态。
new() 一个线程 : 创建状态
start() 方法:可运行状态
CPU调度,决定当前的对象是否是 运行 OR 阻塞 sleep ( ) 主动进入阻塞
run( ) 运行完毕 ,自动进入 销毁状态
其中可运行状态和运行状态可以相互转换,阻塞状态和可运行状态可以相互转换。
线程进入Runnable状态的情况:
(1)调用sleep()方法后经过的时间超过了指定的休眠时间
(2)线程调用的阻塞IO已经返回,阻塞方法执行完毕
(3)线程成功得获得了试图同步的监视器
(4)线程正在等待某个通知,其他线程发出了通知
(5)处于挂起状态的线程调用了resume方法恢复线程
线程出现阻塞状态的情况:
(1)线程调用sleep方法,主动放弃占用的处理器资源
(2)线程调用了阻塞式IO方法,在方法返回前,该线程被阻塞
(3)线程试图获得一个同步监视器,但是该同步监视器正被其他线程所持有
(4)线程等待某个通知
(5)程序调用了suspend()方法,挂起该线程,此方法容易导致死锁,应该避免调用。
3.讲一下为什么会出现死锁.
在多个线程(2个以上)的情况下,相互持有对方需要的锁对象,或者循环持有. 等待对方释放,
解决方案:多线程之间保持相同加锁顺序,尽可能预防出现死锁.
4.讲一下线程同步机制
1. 在需要同步的方法的方法签名中加入synchronized关键字。
2. 使用synchronized块对需要进行同步的代码段进行同步。
3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象。
注:
1、对于同步的方法或者代码块来说,必须获得对象锁才能够进入同步方法或者代码块进行操作;
2、如果采用method级别的同步,则对象锁即为method所在的对象,如果是静态方法,对象锁即指method所在的
Class对象(唯一);
3、对于代码块,对象锁即指synchronized(abc)中的abc;
4、因为第一种情况,对象锁即为每一个线程对象,因此有多个,所以同步失效,第二种共用同一个对象锁lock,因此同步生效,第三个因为是
static因此对象锁为ThreadTest3的class 对象,因此同步生效。
如上述正确,则同步有两种方式,同步块和同步方法(为什么没有wait和notify?这个我会在补充章节中做出阐述)
如果是同步代码块,则对象锁需要编程人员自己指定,一般有些代码为synchronized(this)只有在单态模式才生效;
(本类的实例有且只有一个)
如果是同步方法,则分静态和非静态两种 。
静态方法则一定会同步,非静态方法需在单例模式才生效,推荐用静态方法(不用担心是否单例)。
LOCK:
5.讲一下java如何实现多线程。
a. 继承Thread 对象
b. 实现runnable()接口
c.直接使用线程池工具