线程状态(State
枚举值代表线程状态):
-
新建状态( NEW): 线程刚创建, 尚未启动。
Thread thread = new Thread()
。 -
可运行状态(RUNNABLE): 线程对象创建后,其他线程(比如 main 线程)调用了该对象的
start
方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权。 -
运行(running): 线程获得 CPU 资源正在执行任务(
run()
方法),此时除非此线程自动放弃 CPU 资源或者有优先级更高的线程进入,线程将一直运行到结束 -
阻塞状态(Blocked): 线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。
sleep
,suspend
,wait
等方法都可以导致线程阻塞 - 等待(WAITING): 进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
-
超时等待(TIMED_WAITING): 该状态不同于
WAITING
,它可以在指定的时间后自行返回。 -
终止(TERMINATED): 表示该线程已经执行完毕,如果一个线程的
run
方法执行结束或者调用stop
方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start
方法令其进入就绪。
线程在Running的过程中可能会遇到阻塞(Blocked)情况:
- 调用
join()
和sleep()
方法,sleep()
时间结束或被打断,join()
中断,IO完成都会回到Runnable
状态,等待JVM的调度。 - 调用
wait()
,使该线程处于等待池(wait blocked pool),直到notify()
/notifyAll()
,线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable) - 对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。