java thread 几个状态_Java 几种线程状态之间的相互关系
Java Thread 可能处在以下几种状态
Java Doc 里通过一个枚举类型 Enum 来定义。
线程可以处于以下状态之一:
NEW 尚未启动的线程处于此状态。
RUNNABLE 在Java虚拟机中执行的线程处于此状态。
BLOCKED 被阻塞等待监视器锁定的线程处于此状态。
WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING 正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
TERMINATED 已退出的线程处于此状态。
线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态。
通过示例而不是Java doc中给出的正式定义,可以很容易地理解任何令人困惑的概念。如果它们是现实生活中的例子,它可能更具有相关性。我想分享一些可能有助于理解这些线程状态的现实例子。
由 http://fastthread.io 生成的传递图,显示哪些线程阻塞了哪些线程
BLOCKED 阻塞
Java doc正式将BLOCKED状态定义为:“阻塞等待监视器锁的线程处于此状态。”
现实生活中的例子:今天你要去面试。这是您梦寐以求的工作,这是您过去几年一直瞄准的目标。你早上醒来,准备好了,穿上你最好的衣服,在镜子前面看起来很敏锐。现在你走出你的车库,意识到你的妻子已经开车了。在这种情况下,你只有一辆车,那么会发生什么?在现实生活中,可能会发生斗争:-)。在这里你被阻止,因为你的妻子已经开车了。你将无法参加面试。
这是BLOCKED状态。用技术术语解释它,你是线程T1,你的妻子是线程T2,锁是汽车。T1在锁(即汽车)上被阻挡,因为T2已经获得了这个锁。
提示:线程在等待监视器锁进入同步块/方法或在调用Object#wait()方法后重新输入同步块/方法时,将进入BLOCKED状态。
WAITING 等候
Java doc正式将WAITING状态定义为:“无限期等待另一个线程执行特定操作的线程处于此状态。”
现实生活中的例子:让我们说几分钟后你的妻子带着车回家了。现在你意识到面试的时间已经到了,而且到达那里还有很长的路要走。因此,您将所有动力都放在汽车的油门踏板上。当允许的速度限制仅为60英里/小时时,您以100英里/小时的速度行驶。你不走运,交通警察看到你超过限速,他把你拉到路边。现在你进入WAITING状态,我的朋友。你停止开车,坐在车里闲逛,直到警察调查你,然后让你走。基本上,在他让你离开之前,你会陷入等待状态。
用技术术语解释它,你是线程T1,警察是线程T2。你释放锁(即你停止开车),然后进入等待状态。直到警察(即T2)让你离开,你将陷入这种等待状态。
提示:线程在调用以下方法之一时将进入WAITING状态:
Object#wait() 未指定超时时间
Thread#join() 未指定超时时间
LockSupport#park()
在对象上调用Object.wait()的线程处于WAITING状态,直到另一个线程调用该对象上的Object.notify()或Object.notifyAll()。调用Thread.join()的线程处于WAITING状态,以使指定的线程终止。
TIMED_WAITING 指定时间的等待
Java doc正式将TIMED_WAITING状态定义为:“等待另一个线程在指定的等待时间内执行操作的线程处于此状态。”
现实生活中的例子: 尽管所有的戏剧性,你在采访中表现得非常好,给每个人留下了深刻的印象并得到了这份高薪工作。(恭喜!)你回到家里,告诉你的邻居关于这份新工作,以及你对此感到非常兴奋。你的朋友说他也在同一栋办公楼工作。他建议你们两个应该一起开车。你认为这是一个好主意。所以在工作的第一天,你去他家。你把车停在他家门口。你等了10分钟,但你的邻居仍然没有出来。你继续开始上班,因为你不想在第一天被推迟。现在这是TIMED_WAITING。
用技术术语解释它,你是线程T1,你的邻居是线程T2。你释放锁定(即停止驾驶汽车)并等待长达 10分钟。如果你的邻居T2在10分钟内没出来,你就开始再次开车了。
提示:线程在调用以下方法之一时将进入TIMED_WAITING状态:
Thread#sleep()
Object#wait() 指定超时时间
Thread#join() 指定超时时间
LockSupport#parkNanos()
LockSupport#parkUntil()
结论
当有人在分析线程转储时,理解这些不同的线程状态是至关重要的。处于RUNNABLE,BLOCKED,WAITING和TIMED_WATING状态的线程数是多少?哪些线程被阻止?谁阻止了他们?用于锁定的对象是什么?这些是在线程转储中要分析的一些重要指标。这些详细的线程转储分析可以通过在线工具轻松完成,例如:http://fastthread.io/
java thread 几个状态_Java 几种线程状态之间的相互关系相关推荐
- java线程6种状态转换,java6种线程状态
网上好多帖子把操作系统的线程状态跟java的线程状态混为一谈,导致误导了好多人: 现在根据java的Thread类来分析java的线程状态; java.lang.Thread内部枚举State pub ...
- java 线程状态 jstack_jstack查看jvm线程状态
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增 高了.出现了死锁.死循环等,我们该如何分析呢? 由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所 ...
- 多线程(六)线程的五大生命周期,六个状态,七种基础状态
关于线程的六个状态可以看一下:Java线程的6个状态 建议先看一下上面的文章,再看下面的文章. 线程的五大生命周期 NEW: 线程新建状态 RUNNABLE: 就绪状态 RUN ...
- java结束全部操作代码_Java基本的线程操作(附代码)
啦啦啦啦,从头整理一遍java并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @Testpublic voidnewTread(){ Thread t1= new Thread(newR ...
- java中executors_Java通过Executors提供四种线程池
http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如 ...
- java多线程优先级的方法_Java多线程以及线程优先级
文章目录 1 继承Thread类多线程的实现获取和设置线程名称线程优先级 2 实现Runnable接口3 实现Callable接口4 使用线程池 1 继承Thread类 多线程的实现 实现多线程只需要 ...
- Java文件的状态_java中文件的状态
如何知道文件的状态,即应用程序是否被阻止且是否阻塞.在java中,如果有一个API,或者您可以使用Java IO. 谢谢. 解决方法: 如果您询问文件锁定,则以下示例来自Example Depot,显 ...
- java 100以内冒泡算法_Java俩种形式实现冒泡排序
数据排序的重要性在实际项目开发中的重要性不言而喻,无论是数据整理还是分析都离不开排序这道工序. ------------- 冒泡排序-- 是一种比较简单的排序方法,也是在数据结构课程中我们学习到的第一 ...
- java代码块的定义_Java几种代码块的定义与常见问题
Java几种代码块的定义与常见问题 代码块,通俗的说就是用一对"{}"括起来的一段代码,代码块可以根据位置分为以下几类: 局部代码块:局部代码块就是指直接在方法或是语句中定义的代码 ...
- java输入商品价格 求总价_Java三种商品总价格大于3500或者某种商品总价大于5000,则打三折,否则八折怎么编写...
最后的打折计算浮点数直接计算有误差,所以打折后的总金额可能与手算的在精度上有误差.实际场景中一般计算金额都是用BigDecimal. 然后题目的逻辑有点问题,某种商品的总价大于5000了,那这三种商品 ...
最新文章
- mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
- 【408预推免复习】计算机网络(谢希仁第七版)第一章——概述
- Codeforces 1182A Filling Shapes
- Linux系统编程14:进程入门之Linux进程中非常重要的概念之进程地址空间-原来我们看到的地址全部是虚拟的
- 张效详java就业培训教程学习笔记(三)
- 如何防止Eamil发邮件泄露IP地址,隐藏发件人IP教程
- 【入门】Pytorch实现简单的图片分类器
- 武大博士后出站后应聘在社区做社工引热议,内卷还是人各有志?
- 《Linux C编程从入门到精通》一第1章 Linux基础1.1 Linux的起源、发展和分类
- 程序代码中常用英文单词使用总结
- 读秀(www.duxiu.com)电子书下载器
- 巨坑系列:Java Bean 转 Map 的那些坑
- 影像基础-----CT-MRI图像的特点和临床应用
- 一个8*8的方格子,A点在左下角,B点在右上角,求A点到B点的最短路径有多少条
- js之escape函数
- 监控电池电量和充电状态
- 大学生从业自媒体如何写出爆款文案?
- 二、索引的创建和设计原则
- Vue warn]: Error compiling template:
- 拜腾与博世将在动力系统、驾驶员辅助等方面展开重点合作