线程的六种状态转换

2020-10-21  本文已影响0人  笑疯子

线程的六种状态

同一时间线程只能处于一种状态

获取当前线程状态

可以使用线程的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有以下三种情况:

Blocked状态是针对synchronizedmonitor锁的,但是java中有很多种锁,例如:ReentrantLock。在这些锁中,如果线程没有获取到锁,就会直接进去Waiting状态,其实本质就是调用了LockSupport.park(),进入到Waiting状态。

BlockedWaiting 区别:

计时等待(Timed Waiting)

Waiting是一样的。

线程进入到Timed Waiting状态有以下四种情况:

线程终止(Terminated)

线程进入到Terminated有两种情况:

流程图

流程图

图片原文:传送门

原文发布在:传送门

上一篇 下一篇

猜你喜欢

热点阅读