线程状态

线程一共有几种状态呢?

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态:这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析:
线程一共有6种状态:
 

线程状态

导致状态发生条件

NEW(新建)

线程被创建后,没有启动,即没有调用start方法

Runnable(可运行)

正在 Java 虚拟机中执行的线程

Blocked(锁阻塞)

线程想获取一个锁对象,但该锁对象被其他线程持有了,该线程就进入了阻塞状态;当该线程获取了锁对象后就进入Runnable状态

Waiting(无限等待)

等待另外一个线程执行一个唤醒操作的线程处于这种状态。处于Waiting状态的线程不能自动唤醒,需等待其他的线程执行notify()或notifyAll()方法才会唤醒处于Waiting状态的线程。

TimedWaiting(计时等待)

等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。

Teminated(被终止)

已退出的线程处于这种状态

 状态之间的关系转化:

 发现处于计时等待状态的线程,sleep()只要时间到了,不用获取锁对象就能直接进入Runnable状态;而wait时间到了,还需考虑是否获取锁对象。

原因是sleep()并没有释放锁对象,而wait()会释放锁对象。

 

 
posted @ 2021-07-25 23:13  功不唐捐-纯小喜  阅读(52)  评论(0)    收藏  举报