1 初始(NEW)
创建线程,还未调用start()方法。
2 运行(RUNNABLE)
Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”。
就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该
状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权 。
运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。
3 阻塞:(BLOCKED)
处于运行中的线程,由于某种原因放弃对cpu的使用权,处于阻塞状态,直到其进入就绪状
态,才有机会再次被cpu调用进入运行状态,该状态下的线程不会占用CPU的资源。通常有以下两
种情况造成线程阻塞。
线程获取同步锁失败(因为锁被其他线程占用)。
线程运行过程中,发出IO请求时,此时该线程也会进入阻塞状态。
4 等待:(WAITING):
当处于运行状态的线程调用了无时间参数限制的方法后,如wait()、join()等方法,就会将当前
运行中的线程转换为等待状态,该状态下的线程不会占用CPU的资源。处于等待状态中的线程不能
立即争夺CPU使用权,必须等待其他线程执行特定的操作后,才有机会再次争夺CPU使用权,将
等待状态的线程转换为运行状态。
5 超时等待(TIMED_WAITING)
将运行状态中的线程转换为定时等待状态中的线程与转换为等待状态中的线程操作类似,只
是运行线程调用了有时间参数限制的方法,如sleep(long millis)、wait(long timeout)、join(long
millis)等方法,该状态下的线程不会占用CPU的资源。处于定时等待状态中的线程也不能立即争夺
CPU使用权,必须等待其他相关线程执行完特定的操作或者限时时间结束后,才有机会再次争夺
CPU使用权,将定时等待状态的线程转换为运行状态。
6 终止(TERMINATED)
线程的run()方法、call()方法正常执行完毕或者线程抛出一个未捕获的异常(Exception)、错误
(Error),线程就进入终止状态。一旦进入终止状态,线程将不再拥有运行的资格,也不能再转换到
其他状态,生命周期结束。
简单画下线程的状态流转图: