8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇

举报
字母哥哥 发表于 2022/04/14 01:24:45 2022/04/14
1.4k+ 0 0
【摘要】 本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程、互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发...

本文作为图解java并发编程的第二篇,前一篇访问地址如下所示:

图形说明

在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现:超过80%的图都是不完整的,或者是错的。所以我只好再次去阅读源码,然后画出下面的这张图,理解了这张图,对于大家理解java 线程的方法调用及开发过程会有很大的帮助。

  • 同步阻塞状态比较好理解,就是互斥锁,当前线程使用到的代码块,只有我用完了你才能用。
  • 延时等待状态与等待状态的主要区别在于
    • 延时等待状态不会释放任何资源及监视器。我就是占着茅坑不拉屎,也不给你用。我就是休息一会,我休息完了,我的还是我的。
    • 等待阻塞状态会暂时释放相关线程资源及监视器,我的资源暂时借给你用,等我notify找你的时候你要将资源还给我

Thread.State源码注释

public enum State {
    /**
     *  新生状态:线程对象创建,但是还未start()
     */
    NEW,

    /**
     * 线程处于可运行状态,但是这个可运行状态并不代表线程一定在虚拟机中执行。
     * 需要等待从操作系统获取到资源(比如处理器时间片),才能真正的去运行
     */
    RUNNABLE,

    /**
     * 当前线程处于阻塞状态,正在等待另一个线程的monitor lock释放,才进入synchronized代码块或方法
     */
    BLOCKED,

    /**
     * 调用Object#wait() 、 Thread.join方法后当前线程处于等待状态,
     * 等待其他的线程执行特定的动作,才能从等待状态退出。
     * 比如:Object.wait()的线程需要等待其他线程调用Object.notify()、Object.notifyAll()才能退出
     * 比如:调用了Thread.join()的线程需要等待指定的线程执行完成才能退出等待状态。
     */
    WAITING,

    /**
     * 进入特定时间内的等待状态,等待一段指定的时间sleep(timed)、wait(timed)或者等待Thread.join(timed)的时间.
     * 到达指定时间点自动退出恢复到RUNNABLE状态
     */
    TIMED_WAITING,

    /**
      * 线程结束状态
     */
    TERMINATED;
}

  
 

文章来源: zimug.blog.csdn.net,作者:字母哥哥,版权归原作者所有,如需转载,请联系作者。

原文链接:zimug.blog.csdn.net/article/details/108507627

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。