多线程的生命周期
1. 线程周期
NEW
:新建状态。RUNNABLE
:在JAVA虚拟机中执行的线程处于这个阶段BLOCKED
:线程阻塞状态,被阻塞等待监视器锁定的线程处于这个状态。WAITING
:正在等待另一个线程执行特定的动作的线程处于这个状态(waiting状态也算blocked状态的一种)。TIMED_WAITING
:正在等待另一个线程执行动作达到指定等待时间的线程处于这个状态。TERMINATED
:已退出的线程处于此状态。
2. 线程状态的进一步说明
-
NEW
: 在调用 strat() 之前的状态。 -
RUNNABLE
:可运行状态,是个复合状态,可分为两类:- :READY:就绪状态。
- RUNNING:表示该线程正在执行。
- 可通过上篇说到的 Thread.yield/join 方法,完成放弃CPU资源,使得该线程从 RUNNING状态转到 :READY。
- 然后如果在被程序调度器选中,又从 :READY状态转到 RUNNING状态。
-
BLOCKED
:阻塞状态,当线程发起阻塞的 I/O 操作,或者申请其它线程独占的资源,线程会转换为 BLOCKED阻塞状态,处于阻塞状态的线程不占用 CPU 资源。当阻塞I/O操作完成时,或者线程获得了其他资源,线程可以转换为 RUNNABLE 状态。① 等到需要的数据都准备完毕再回复 ———— 中间一直默不作声,这就是同步IO。
② 先告诉应用程序数据没有准备好,然后准备好数据,通知(回调)应用程序或被轮询 ——这就是异步IO。
① 一直等,直接数据都发过来,然后再进行下一步。———— 阻塞IO。
② 先干别的,然后定期查询或等待回调。————— 非阻塞IO。
-
WAITING:
等待状态,线程执行了Object.wait(),Thread.join,会把线程转换为 WAITING状态。执行了Object.notify()方法,或者加入的线程执行完毕,会把线程从等待状态转为 RUNNABLE状态。 -
TIMED_WAITING:
和WAITING 状态类似,区别在于状态的线程不会无限等待,如果在指定时间内完成了指定的操作,就会转换为 RUNNABLE状态。 -
TERMINATED(终止):
线程结束处于的状态。