参考:Java多线程编程实战指南 核心篇
个人理解,如有不足之处,请大家指出。
在Java语言中,一个线程从其重建、启动到终止可能会经历NEW、RUNNABLE、WAITING、TIMED_WAITING、BLOCKED、TREMINATED等状态。
1.NEW
一个刚被创建但还没启动(调用该线程的start()方法)的线程就处于该状态。
2.RUNNABLE
该状态包括两个子状态:READY以及RUNNING。
READY表示该线程的start()方法已被调用,但是该线程此刻没有被线程调度器调度。
RUNNING表示该线程正在运行。
READY-->RUNNING:线程被线程调度器调度。
RUNNING-->READY:执行Thread.yield()(但该线程可能立马又被调度器调度转为RUNNING状态)、CPU时间片用完
3.WAITING
处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显示地唤醒。
以下方式会使线程进入这个状态:
没有设置TimeOut参数的Object.wait()方法;
没有设置TimeOut参数的Thread.join()方法;
LockSupport.park()方法;
4.TIMED_WAITING
处于这种状态的线程也不会被分配CPU执行时间,不过无需等待被其他线程显示地唤醒,在经过一定时间后它们会自动被唤醒。
以下方法会让线程进入这种状态:
Thread.sleep();
设置了TimeOut参数的Object.wait()方法;
设置了TimeOut参数的Thread.join()方法;
LockSupport.parkNanos()方法;
LockSupport.parkUntil()方法;
5.BLOCKED
一个线程发起一个阻塞式I/O操作、或者申请由其它线程独占的资源(如,锁等),都会使线程转为该状态。
6.TREMINATED(DEAD)
当Thread.run()调用结束/当前进程结束/在run()方法执行过程中抛出异常都会使该线程终止。
注:一个线程只能被启动一次,也就是说,在线程的生命周期中,只会又一次处于NEW状态。若调用两次一个thread的start()方法,会抛出“java.lang.IllegalThreadStateException”异常。
在线程的生命周期中,也只会又一次处于TREMINATED状态。