根据jdk1.6的api,java的Thread类,定义了六个状态:

线程状态。线程可以处于下列状态之一:

  • NEW
    至今尚未启动的线程处于这种状态。
  • RUNNABLE
    正在 Java 虚拟机中执行的线程处于这种状态。
  • BLOCKED
    受阻塞并等待某个监视器锁的线程处于这种状态。
  • WAITING
    无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
  • TIMED_WAITING
    等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
  • TERMINATED
    已退出的线程处于这种状态。

在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。

其中,Blocked状态以及Waiting以及Timed_waitting都会导致线程暂停运行。但是,Blocked以及waitting状态是有区别的。查询Blocked以及Waiting的api可知:

如图所示,BLOCKED是由于等待某个监视器锁而使得线程切换到此状态的,而wait是因为调用了

  • 不带超时值的 Object.wait
  • 不带超时值的 Thread.join
  • LockSupport.park

三个方法中的一个,使得线程进入了wait状态。这是从原因上讲的区别。

此处,着重分析一下object.wait,这个方法是继承自Object父类的方法,此方法的实现依赖于本地实现。Object.wait的api如下:

如图所示,线程要想调用object.wait来使得自己变成waitting状态,首先需要拥有object的monitor对象。如果不具有该object的monitor对象,则无法变成waitting状态,同时会抛出IllegalMonitorStateException异常

如何才能拥有object的monitor对象呢?参考api:

总结如下:

使得线程变成waitting状态有以下几种方法:

调用Object对象的wait方法,但没有指定超时值。

调用Thread对象的join方法,但没有指定超时值。

调用LockSupport对象的park方法。

使得线程变成timed_waitting状态有以下几种方法:

调用Thread.sleep方法。

调用Object对象的wait方法,指定超时值。

调用Thread对象的join方法,指定超时值。

调用LockSupport对象的parkNanos方法。

调用LockSupport对象的parkUntil方法。

使得线程变成blocked状态有以下方法:

进入一个synchronized代码块失败

进入一个synchronized方法失败

在调用了object.wait之后,被其他线程object.notify唤醒之后,重新进入同步代码块或者同步方法失败。

Object.wait()

1. 前提:必须持有Object的monitor对象

2. 效果1:使得线程变为了waitting状态

3. 效果2:释放所有通过synchronized模式已经获取到的锁

4. 效果3:将本线程加入到了object的等待池中

Thread.sleep()的效果:

1前提:无需任何前提

2效果1:使得线程变为了timed_waitting状态,但是不释放已经获取到的锁资源

Java线程中,Blocked,Wait,以及TIMED_WAIT的区别相关推荐

  1. java 线程 获取消息_获取java线程中信息

    怎样获取java线程中信息? 在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方 ...

  2. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  3. Java 9中--add-exports和--add-opens有什么区别?

    在Java 9(jdk-9 + 170)默认情况下不允许应用程序查看来自JDK的所有类,而不像以前的所有Java版本.需要使用--add-exports和--add-opens配置参数,例如: --a ...

  4. Java线程状态中BLOCKED和WAITING有什么区别?

    刚才在看CSDN的问答时,发现这个问题.原问题的作者是在观察jstack的输出时提出的疑问,那么BLOCKED和WAITING有什么区别呢? 答复在JDK源码中可以找到,如下是java.lang.Th ...

  5. java线程中yield()和join()的区别

    多线程在面试中是非常受欢饮的题目,我个人认为我们很少有机会能够真正的用到复杂的多线程(我在7年前使用过一次),熟悉这些概念能够增加你的信心,先前,我已经讨论了一个相似的问题,wait()和sleep( ...

  6. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  7. java线程中等待_Java:线程中的Thread.sleep():没有等待

    线程没有睡觉我有问题. 我不能把我的整个代码放在这里.所以,为了重现,这里是一个等待5秒的基本代码. try { int millisec = 5000; System.out.println(new ...

  8. java线程 yield_Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  9. java 线程中创建线程_java – 在线程中创建线程 – 良好的做​​法?

    参见英文答案 > Threads within threads in Java?                                    4个 在线程中启动线程是一种好习惯吗?我搜 ...

最新文章

  1. 2020年,那些「引爆」了机器学习社区的热门论文、库和基准
  2. Elixir 1.2带来多项功能增强和性能提升
  3. 【计算理论】可判定性 ( 非确定性有限自动机的接受问题 | 证明 “非确定性有限自动机的接受问题“ 的可判定性 )
  4. springcloud-06-feign的使用
  5. 可信平台模块(TPM)概念介绍
  6. 系统什么时候会用到swap分区?
  7. angular.forEach()
  8. DateUtils 工具类
  9. 浙江大学计算机图形学视频教程,浙江大学现代教务管理系统
  10. 北斗一代卫星导航系统简介
  11. 关于pthread_cancel()的运用,取消点的理解
  12. 下载QQ空间鼠标图标方法
  13. php 时辰,生辰八字时辰查询表对应的时间
  14. 数字图像处理:图像几何变换(Matlab实现几何变换+原理解析
  15. 2022年湖南省自考考试幼儿园教育活动设计与组织练习题及答案
  16. FMX探索之IMAGE控件上输出
  17. 阿里P6晋升到P7是一个坎吗? P7 晋升总结
  18. 安徽科技学院 信网学院网络文化节 陈旭
  19. 高中所学过的计算机知识,浅谈高中计算机学习重点论文
  20. JS实现网站悬浮广告

热门文章

  1. 世界上第一代电子计算机取名为,计算机应用基础知识计算机应用基础试题及答案...
  2. 在校外,如何免费下载知网上的文献论文的方法
  3. 使用wireshark找不到“捕获接口”问题的解决
  4. 30000字Linux期末考试复习总结
  5. 智能科技五大创新商业模式
  6. linux微信最新版无法打开问题解决
  7. QtXlsx 读写 excel
  8. MFC--学生管理系统
  9. 淘宝新店流量如何从0到1000
  10. 24点游戏---java编写