操作系统中线程的生命周期
JDK中用Thread.State类定义了线程的几种状态
新建→就绪
进程刚创建出来就是新建状态,当资源分配完毕后就会变成就绪状态。
就绪→运行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成运行状态。
运行→就绪
处于运行状态的进程在其执行过程中,因分配给它的一个时间片已用完或更高优先级的进程抢占而不得不让出CPU,于是进程从运行状态转变成就绪状态。
运行→阻塞
正在执行的进程因等待某种事件发生而无法继续运行时,便从运行状态变成阻塞状态。
阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
运行→终止
程序运行完毕就会变成终止状态。
线程的生命周期中可分为以下6种状态:
-
NEW(初始化)状态
实例化一个Thread类对象出来(未执行start()方法前),Thread的状态为NEW。
-
RUNNABLE(可运行)状态
调用线程的start()方法,此时线程进入RUNNABLE状态,该状态的线程位于可运行线程池中,等待被操作系统调度,获取CPU的使用权。
当获得CPU的时间片时,线程进入运行状态,执行程序代码。
- BLOCKED(阻塞)状态当线程等待获取monitor锁(synchronized)时,线程就会进入BLOCKED状态。
> 等待获取monitor锁,线程的状态是BLOCKED。
> 等待获取Lock锁(LockSupport.park()),线程的状态是WAITING。 -
WAITING(等待)状态
当执行Object.wait()、Thread.join()、LockSupport.park()等操作时,线程会从RUNNABLE状态进入WAITING状态。当执行Object.notify()/notifyAll()、Thread.join()程序执行完、LockSupport.unpark()、线程被中断等操作时,线程会从WAITING状态进入RUNNABLE状态。
-
TIMED_WAITING(超时等待)状态
当执行Thread.sleep(time)
> Thread.join(time)
> Object.wait(time)
> LockSupport.parkNanos(time)
> LockSupport.partUntil(time)等操作时,线程会从RUNNABLE状态进入TIMED_WAITING状态。当运行超时时间到
> Thread.join()线程执行完
> Object.notify()/notifyAll()
> LockSupport.unpark()
> 线程被中断等操作时,线程会从TIMED_WAITING状态进入RUNNABLE状态。 -
TERMINATED(终止)状态
当线程执行完毕、Thread.stop()、内存溢出时,线程就会进入TERMINATED状态。
线程一旦死亡,就无法复活。在一个死亡的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
Java中线程的状态与操作系统中线程的对应关系:
NEW→新建
RUNNABLE→就绪、运行、部分阻塞
TIMED_WAITING→阻塞
WAITING→阻塞
BLOCKED→阻塞
TERMINATED→终止