线程状态详解

导读:本篇文章讲解 线程状态详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

线程状态详解

 1、源码中的几个状态

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}
 

2、线程的6种状态解释

结合上面的那张图一起看:

NEW:线程被创建出来了,但是还没有start()。

RUNNABLE:可运行状态,这个状态比较特殊,我在图中把这个状态拆分成了两部分:一部分是READY,顾名思义是准备状态,另一部分是RUNNING,即运行状态。

准备状态:只能说明你有资格运行,单只要调度程序没有调度到你,你就永远是准备状态。从图中可以看出,好几个状态都能切换到准备状态,至于切换的方法,我在下文详细给大家整理出来介绍。

运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。说白了,就是线程跑起来了。

BLOCKED:阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。

WAITING:等待状态的线程不会被分配 CPU 执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

TIMED_WAITING:超时等待状态的线程不会被分配 CPU 执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。这是和上面的 WAITING 状态的区别。

TERMINATED:终止状态,顾名思义,线程执行结束了。
 

3. 线程状态之间的切换函数分析

从上面的图中可以看出,线程之间的状态切换,主要涉及到以下几个函数:

Thread.sleep、Thread.yeild、Object.wait、Thread.join、Object.notify/notifyAll、LockSupport.park/unpark/parkNanos/parkUtil

接下来针对这几个函数,做一下简单的功能分析和对比,大家可以结合上面的那幅图。

Thread.sleep(time):当前线程调用此方法,顾名思义,就是让当前线程进入 TIMED_WAITING 状态,睡眠固定的时间(但是不释放对象锁),到点后自动唤醒,进入准备状态。主要作用是给其他线程执行机会。

Thread.yield():当前线程调用此方法,放弃获取的CPU时间片,但不释放锁资源,由运行状态变为准备状态,让OS再次选择线程。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。它跟 sleep方法的区别在于不能指定暂停多少时间。

Object.wait():当前线程调用对象的wait()方法,当前线程释放对象锁,进入WAITING 状态。依靠notify()/notifyAll()来唤醒;而wait(time)方法的主要区别是进入 TIMED_WAITING 状态,到达时间后,自动唤醒。

Object.notify/notifyAll:notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。

Thread.join():当前线程里调用其它线程 t 的join()方法,当前线程进入 WAITING 状态,当前线程不会释放已经持有的对象锁。线程 t 执行完毕,当前线程进入 RUNNABLE 状态。而join(time)方法的主要区别是当前线程进入 TIMED_WAITING 状态,到达时间后,进入 RUNNABLE 状态。

LockSupport.park():当前线程进入 WAITING 状态,需要通过LockSupport.unpark(thread)来唤醒。

LockSupport.parkNanos(nanos)/parkUntil(deadlines):当前线程进入 TIMED_WAITING 状态,需要通过“LockSupport.unpark(thread)`来唤醒。

相比与wait方法,LockSupport不需要获得锁就可以让线程进入 WAITING 或者 TIMED_WAITING 状态。

当然了,还有个 BLOCKED 状态,涉及到 synchronized关键字,可以理解为就是多个线程抢一个ready的执行机会

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/105978.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!