本文作为图解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;
}

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

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

  1. 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

    1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...

  2. Java线程状态图

    嘤,先盗图一张,后面再补充描述!

  3. java 线程状态图

  4. 人人都可以写的可视化Python小程序第二篇:旋转的烟花

    兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...

  5. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  6. 程序员的视角:java 线程(转)

    在我们开始谈线程之前,不得不提下进程.无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等. ...

  7. 程序员的视角:java 线程

    在我们开始谈线程之前,不得不提下进程. 无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等 ...

  8. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  9. java线程的理解

    java thread类都是native方法实现的,所以没有用平台无关的方法实现,怎么实现的呢? 线程的实现: 第一种:使用内核线程实现. 内核线程就是直接使用操作系统内核支持的线程,由内核完成切换. ...

随机推荐

  1. Go语言入门系列(五)之指针和结构体的使用

    Go语言入门系列前面的文章: Go语言入门系列(二)之基础语法总结 Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 1. 指针 如果你使用过C或C++,那你肯定对指针这个概念 ...

  2. arcgis api for js 之网络分析服务发布

    1.引言 百度地图上有这样的功能:点击两个点,地图上会显示对两个点的路径规划.这个功能能否利用 arcgis api 实现呢?答案是肯定的.不过在实现之前,我们需要将数据发布为网络分析服务,接下来我将 ...

  3. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  4. Android Studio Gradle build 报错:Received status code 400 from server: Bad Request

    错误提示如下 Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/ ...

  5. 题解 洛谷 P1553

    字符串入门题,读入一行字符,先将第一个数读入翻转,读入下一个字符(如果没有则退出),再将下一个数读入翻转 #include<iostream> #include<cstdio> ...

  6. Vue中 props 这些知识点

    如果你一直在阅读有关"props"内容,你会发现我们可能也一直在使用它们(即使没有意识到),但也许你并不完全确定它们是什么.或者如何正确使用它们,并充分利用它们. 当你读完这篇指南 ...

  7. Redis设计与实现——单机数据库的实现

    数据库 服务器中的数据库 redisClient切换数据库 redis客户端默认目标数据库为0号数据库,可以通过SELECT命令来切换目标数据库. 客户端状态redisClient结构的db属性记录了 ...

  8. hadoop2.6虚拟机安装

    Linux环境设置/*安装Hadoop集群时要确保以下几个方面1.本机与虚拟机之间是否可以通信(Ping).如果不行检查下面 1.1本机防火墙关闭(开启情况是本机可以ping虚拟机,虚拟机不能ping ...

  9. 彻底搞懂https原理

    我终于彻底理解了https原理!!!激动之下,写一篇博客,搞一波分享!!! 本篇博客比较精彩的地方: 思维方式:也是借鉴一位大佬的,写得很棒.https://blog.csdn.net/guolin_ ...

  10. js byte字节流和数字,字符串之间的转换,包含无符和有符之间的转换

    var NumberUtil={ //byte数组转换为int整数 bytesToInt2:function(bytes, off) { var b3 = bytes[off] & 0xFF; ...