在Java中,一个线程从建立到消亡会经历新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态。在运行过程当中,线程会在这几个状态之间流转。线程
下面对这几种状态作下简单解释:对象
新建状态(New) 新建立了一个线程对象。blog
就绪状态(Runnable) 线程对象建立后,其余线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。生命周期
运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码。文档
阻塞状态(Blocked) 阻塞状态是线程由于某种缘由放弃CPU使用权,暂时中止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的状况分三种同步
等待阻塞(WAITING):运行的线程执行wait()方法,JVM会把该线程放入等待池中。
同步阻塞(BLOCKED):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
其余阻塞(TIMED_WAITING):运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程从新转入就绪状态。it
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。线程池
对于线程的新建、就绪、运行和死亡状态,咱们都比较好理解。线程的三种阻塞状态的含义可能会让人比较困惑。下面就来解释下这三种状态的区别:请求
1. 等待阻塞状态(TIMED_WAITING)
Java文档官方定义TIMED_WAITING状态为:“一个线程在一个特定的等待时间内等待另外一个线程完成一个动做会在这个状态”。调用下面的这些方法会让线程进入TIMED_WAITING状态。程序
2. WAITING状态
Java文档官方定义WAITING状态是:“一个线程在等待另外一个线程执行一个动做时在这个状态。”
当线程调用如下方法时会进入WAITING状态:
在对象上的线程调用了Object.wait()会进入WAITING状态,直到另外一个线程在这个对象上调用了Object.notify()或Object.notifyAll()方法才能恢复。一个调用了Thread.join()的线程会进入WAITING状态直到一个特定的线程来结束。
2. BLOCKED状态 Java文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”