线程的六种状态转换
线程的六种状态
同一时间线程只能处于一种状态
-
New
新创建 -
Runnable
可运行 -
Blocked
被阻塞 -
Waiting
等待 -
Timed Waiting
计时等待 -
Terminated
被终止
可以使用线程的
getState()
获取当前线程的状态Thread thread = new Thread();
System.out.println(thread.getState());
新建状态(New)
New
的意思是当前线程新建出来但没有启动,比如新建一个线程时new Thread()
,此时线程就处于New
状态,如果线程调用的了start()
方法,此时线程开始执行run()
下面的方法,这时候线程的状态也就会从New
变成Runnable
状态。可运行状态(Runnable)
在Java中,
Runnable
状态分为两种,一种是可能没有运行,正在等待CPU调度资源分配给线程使用,另外一种是已经正在运行。假设A线程正在执行,跑到一半分配的CPU资源被调度走做了别的事情,那么此时该线程会暂时不运行,等待重新分配CPU资源,这个时候线程的状态还是RUnnable
状态不会做出改变。阻塞状态(Blocked)
线程从
RUnnable
状态变成Blocked
状态只有一种途径,就是当线程进入到synchronized
没有拿到当前代码块对应的monitor
锁,这个时候线程就会进入到Blocked
状态。等待状态(Waiting)
线程从
Runnable
进入Waiting
有以下三种情况:- 线程调用了没有设置
Timeout
参数的Object.wait()
方法。 - 线程调用了没有设置
Timeout
参数的Thread.join()
方法。 - 线程调用了
LockSupport.park()
方法。
Blocked 和 Waiting 区别:Blocked
状态是针对synchronized
的monitor
锁的,但是java中有很多种锁,例如:ReentrantLock
。在这些锁中,如果线程没有获取到锁,就会直接进去Waiting
状态,其实本质就是调用了LockSupport.park()
,进入到Waiting
状态。
-
Blocked
等待其它线程释放monitor
锁。 -
Waiting
是等待其它条件,例如join()
执行结束,或者是notify()
和notifyAll()
。
与线程进入到Waiting
是一样的。
Timed Waiting
状态有以下四种情况:- 线程调用了设置时间参数的
Thread.sleep(long millis)
方法。 - 线程调用了设置时间参数的
Object.wait(long timeout)
方法。 - 线程调用了设置时间参数的
Thread.join(long millis)
方法。 - 线程调用了设置时间参数的
LockSupport.parkNanos(long nanos)
和LockSupport.parkUntil(long deadline)
方法。
线程进入到
Terminated
有两种情况:-
run()
方法中代码执行完毕,正常退出。 - 出现没有捕获的异常,终止的
run()
方法,意外退出。
文章图片
流程图 图片原文:传送门
【线程的六种状态转换】原文发布在:传送门
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量