线程状态
1. 线程状态分类及转换
线程状态可分为六态或者七态
- 六态:New(新建状态)、Runnable(可运行状态)、Terminated(终止状态)、Waiting(等待状态)、TimedWaiting(超时等待状态)、Blocked(阻塞状态)
- 七态:New(新建状态)、Ready(就绪状态)、Running((运行状态)、Terminated(终止状态)、Waiting(等待状态)、TimedWaiting(超市等待状态)、Blocked(阻塞状态)
线程状态转换图:
2.线程状态
-
New(新建状态):
通过实现Runnable接口或者继承Thread声明一个线程类,new一个实例之后,线程进入新建状态。
-
Ready(就绪状态):
线程对象创建成功后,调用该线程的start()函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取CPU的使用权。
-
Running(可运行状态):
此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。(即线程获取到了cpu时间片)。当线程时间片用完或调用的yield()函数,该线程回到就绪状态。
-
Terminated(终止状态)
线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。线程终止后就不能复生了。
-
Waiting(等待状态)
运行状态的线程执行wait()与join()函数会让JVM把该线程放入锁等待队列。处于这种状态的线程不会被分配cpu执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。
唤醒线程可以通过执行LockSupport.unpark(t)函数唤醒指定线程,该线程回到就绪状态。
而通过notify()、notifyAll()、join线程执行完毕方式,会唤醒锁等待队列的线程,出现的线程回到就绪状态。
-
TimedWaiting(超时等待状态)
超时等待状态(Timed waiting)超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。
wait(long)、join(long)、LockSuport.parkNanos(long)、LockSuport.parkUtil(long)、sleep(long)等函数会触发超时等待状态。
wait(long)、join(long)函数会让JVM把线程放入锁等待队列。
超时时间到了,则会进行自动唤醒,后续过程则和等待状态相同。
-
Blocked(阻塞状态)
运行状态的线程获取同步锁失败或发出I/O请求,该线程进入阻塞状态。
如果是获取同步锁失败JVM还会把该线程放入锁的同步队列。
同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。I/O处理完毕时,该线程重新回到就绪状态。
参考:公众号:编程技术进阶