线程间状态及通信方式
1、初始状态:
- 创建一个线程类,它实现Runnable或继承Thread。当这个类被new出来时(新实例简称newT),线程进入初始状态。
2、可运行状态:
- newT执行start()方法,即可进入可运行状态。
- 当sleep睡醒时,或者被join插入的方法结束时,或者用户输入结束,可以进入可运行状态。
- 当cpu时间片用完,调用线程的yield方法,进入可运行状态。
- 锁池队列拿到对象锁后进入可执行状态
3、运行状态:
- 可运行状态被CPU调度程序调度
4、阻塞状态:
- newT调用sleep方法进入阻塞状态
- secondT join进newT线程中进入阻塞状态
- 等待用户输入时进入阻塞状态
5、锁池队列状态
- 当newT希望调用一个对象的Synchronized方法时,发现该方法被其他线程占用,则newT进入锁池状态。
- 当newT被secondT唤醒时,newT进入锁池状态
6、等待队列状态:
- 当调用wait方法时会进入等待队列,需要注意执行wait必须先获得对象锁
7、结束状态:
- 当线程的run()方法完成时进入结束状态
- 主线程的main()方法完成时进入结束状态
线程通信方式:wait/notify
我们注意到 Object类有一些方法,其中就有wait()和notify()方法,
wait()方法放弃了CPU时间,进入阻塞状态。
notify()方法通知阻塞的线程,使得线程被唤醒。这就是最常用的通讯方式之一
线程通信方式:同步
当两个线程同时持有一个类的对象实例,当两个线程分别调用同步方法(不同的方法),那么两个线程都要有其中一个执行,另一个等待,然后等第一个线程执行完毕再次执行。这也是交互手段之一。