Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

一、线程5种状态

  1. 新建状态(New) 新创建了一个线程对象。

  2. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

  3. 运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码。

  4. 阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

    • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
    • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
    • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

这里写图片描述


二、Jstack中常见的线程状态

应用程序启动后,我们对系统运行状况的观测大部分情况下是通过运行日志。但是若某一天发现,日志中记录的行为与预想的不一致,此时需要进一步的系统监控该怎么办,Jstack是常用的排查工具,它能输出在某一个时间,java进程中所有线程的状态,很多时候这些状态信息能给我们的排查工作带来有用的线索。 
Jstack的输出中,Java线程状态主要是以下几种:

  • RUNNABLE 线程运行中或I/O等待
  • BLOCKED 线程在等待monitor锁(synchronized关键字)
  • TIMED_WAITING 线程在等待唤醒,但设置了时限
  • WAITING 线程在无限等待唤醒

这里Jstack使用的关键字描述的线程状态与上一节中线程不太一样,所以可能理解上的可能会出现混淆。虽然Java中的线程一样有上节中描述的5种状态,但在实际情况下线程新建状态和死亡状态持续很短,我们也并不太关心。大多时候我们关注的是运行状态/阻塞状态,这里弄清楚Jstack的输出含义即可。下面用简单的代码产生出以上4中状态。

    public static void main(String[] args) {System.out.println(Utils.pid());runnable();     // 1 // blocked(); // 2 // waiting(); // 3 // timedWaiting(); // 4 } public static String pid() { String name = ManagementFactory.getRuntimeMXBean().getName(); return name.split("@")[0]; }

这里为了方便得到java进程id,直接使用pid()函数输出。为了方便,我们把观察线程固定为”main”,因为JVM还有其他线程都会存在输出中,我们可以通过关键字”main”找到我们要观察的线程。命令jstack -l [pid]。

1) 让线程一直处于RUNNABLE

    public static void runnable() {long i = 0; while (true) { i++; } }

没什么好解释的,死循环即可。

2) 让线程一直处于BLOCKED

    public static void blocked() {final Object lock = new Object(); new Thread() { public void run() { synchronized (lock) { System.out.println("i got lock, but don't release"); try { Thread.sleep(1000L * 1000); } catch (InterruptedException e) { } } } }.start(); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (lock) { try { Thread.sleep(30 * 1000); } catch (InterruptedException e) { } } }

主线程sleep,先让另外一个线程拿到lock,并长期持有lock(sleep会持有锁,wait不会)。此时主线程会BLOCK住等待lock被释放,此时jstack的输出可以看到main线程状态是BLOCKED。这里要注意的是只有synchronized这种方式的锁(monitor锁)才会让线程出现BLOCKED状态,等待ReentrantLock则不会。

3) 让线程处于TIMED_WAITING状态

    public static void timedWaiting() {final Object lock = new Object(); synchronized (lock) { try { lock.wait(30 * 1000); } catch (InterruptedException e) { } } }

用Lock.tryLock(timeout, timeUnit),这种方式也会看到TIMED_WAITING状态,这个状态说明线程当前的等待一定是可超时的。

4) 让线程处于WAITING状态

    public static void waiting() {final Object lock = new Object(); synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { } } }

无超时的等待,必须等待lock.notify()或lock.notifyAll()或接收到interrupt信号才能退出等待状态。同理,ReentrantLock.lock()的无参方法调用,也会使线程状态变成WAITING。


通过以上几个最简单的例子,让线程达到jstack输出中常见的几种状态,可以更好地理解jstack输出。

转载于:https://www.cnblogs.com/barrywxx/p/8576358.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彩票相关知识

很多人做梦都想中得彩票头奖,很多人希望天上能掉下馅饼来砸中自己,很多人在作白日梦……彩票是一种风险投资,是一种四两拨千斤的气势,更是一种众人拾柴火焰高的真实写照,没买过彩票的人是很难体会那种美好的期望及期望…

(模拟信号/数字信号)分别以(模拟信号/数字信号)中传输方式

1、基本概念、基本术语和数据通信系统 1.基本概念和基本术语 数据:能够由计算机处理的数字、字母和符号等具有一定意义的实体。 分类:模拟数据可以在一定的数据区域中取连续的值,如声音和图像;数字数据只能取离散的数值&#xff0…

android11 rom,小米打造基于安卓11的ROM来了:米10尝鲜

原标题:小米打造基于安卓11的ROM来了:米10尝鲜据XDA报道,距离Android 11正式版发布还有几天时间,9月8日正式面向Pixel 2、Pixel 3、Pixel 4和Pixel 3a等机型推送Android 11正式版。另一方面,各大手机品牌已经紧锣密鼓开…

基于 HTML5 WebGL 的 3D 服务器与客户端的通信

这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子。3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算是我对这次项目的一个…

七种常见的核酸序列蛋白编码能力预测工具 | ncRNAs | lncRNA

注:这些工具的应用都是受限的,有些本来就是只能用于预测动物,在使用之前务必用ground truth数据来测试一些。我想预测某一个植物的转录本,所以可以拿已经注释得比较好的拟南芥来测试一下。(测试的结果还是比较惊人的&a…

寒武纪找到了引领中国AI芯片走向世界的路

大约6亿年前在地质学上被称作“寒武纪”的时代,大量无脊椎动物在短时间内出现“生命大爆发”。如今,“寒武纪”这个名字再次被人们提及,它源自中科院计算所研发的人工智能芯片处理器的命名,意喻人工智能即将迎来大爆发的时代。“寒…

浅谈PPM (Project Portfolio Management)

前言: 本文以纯理论性的PPM讲解为主,不会涉及到具体如何实施,我会在以后介绍详细的PPM实施方案介绍。 PPM,可能很多人并不清楚甚至可能没听说过,这是一个近些年才流行起来的概念,是Project Portfolio Mana…

Android怎么插手机卡,魅蓝E手机卡怎么装 魅蓝E手机SIM卡安装图文教程

昨天下午,魅族发布了全新系列魅蓝手机——魅蓝E,定位魅蓝高端产品线,售价1299元,李楠号称魅蓝E采用三四千元的旗舰机工艺,外观/屏幕/拍照提升明显。此外,魅蓝E依旧支持全网通双卡双待。那么魅蓝E怎么插卡/装…

快速幂总结

快速幂总结 快速幂这个东西比较好理解,但实现起来到不老好办,记了几次老是忘,今天把它系统的总结一下防止忘记。 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来…

第三章

一.项目前期的主要工作 1.现状分析 ①.硬件分析 ②.软件分析 2.需求收集 3.粗略设计 ①.体系结构分析 ②.硬件(网络)设计 ③.应用系统设计 ④.安全设计 ⑤.配套设计 4.可行性分析 二.结构的项目前期实例 1.组织分析 3.需求收集 4.粗略设计 ①.系统体系结…

荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...

荣耀CEO赵明亲自参加高通2021技术峰会,宣布与高通达成战略合作,未来全系产品采用高通平台。赵明同时透露未来的产品动向,不排除未来与华为继续合作,采用鸿蒙操作系统的可能。赵明表示,Android操作系统依旧是荣耀的首选…

三周第三次课 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录

3.7 su命令1、su命令su命令是用来切换用户的;su命令需要使用- 进行切换,如果不使用- 也可以,但当前目录是在root下,没有彻底切换在root下 使用su命令创建文件,以指定用户的身份创建文件切换后显示-bash-4.2因为user5的…

html坐标绘制路径,canvas学习笔记之绘制简单路径

1 线段(直线路径)绘制线段一般步骤:moveTo(x,y) 移动画笔到指定的坐标点(x,y)lineTo(x,y) 使用直线连接当前端点和指定的坐标点(x,y)stroke() 根据当前的画线样式,绘制当前或已经存在的路径2 矩形路径绘制矩形路径一般步骤:rect(x, y, width, height) 矩形路径&…

增加表单的文字段的html的代码是,表单及表单新增元素(示例代码)

要想更好运用表单就要了解表单的的更多元素与属性,首先看看对表单基本了解。表单的基本了解 元素用于用户输入数据的收集元素是最重要的表单元素,有许多type其中是用于向表单处理程序提交表单的按钮。元素 元素定义待选择的下拉列表选项,元素…

给博客或站点加入百度统计

概述 记得刚接触百度统计的时候,苦于没有个人网站,不能加入统计代码查看访问量等数据。然后渐渐的忘了这件事。之前看别人博客中提及了百度统计,然后粗略的看了一下加入方法,觉得很惊喜,太简单了! 加入方法…

项目规划管理

项目规划管理 - 1 项目规划是预测未来,确定要达到的目标,估计会碰到的问题,并提出实现目标、解决问题的有效方案、方针、措施和手段的过程。( 摘自百度百科) 大家应该都看过不少美国大片,是否记得很多片子里,特别是偷…

android9叫什么名字,白猜这么多名字!谷歌Android 9.0正式发布:命名Android Pie

日前,谷歌对外公布了Android P的beta版,并向索尼Xperia XZ2、小米Mi Mix 2S、诺基亚7 Plus、Oppo R15 Pro、Vivo X21、一加6和Essential PH-1开放测试。今天,谷歌终于宣布正式发布Android 9.0的正式版本。据外媒GSMArena报道,今天…

再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化

原文:再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化继上篇文章《绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来》发布后在博客园首页展示得到了挺多的阅读量,我这篇文章就是对上篇文章的千万…

wps html编辑表格,WPS 2017个人版演示word使用技巧(wps2017表格使用技巧)

wps2017是一款非常深受用户喜爱的办公软件。在2017这个新的版本中,依旧继承了它之前兼容免费、体积小、多种界面切换、云办公等众多优秀的功能特点,下面小编就来教大家wps2017的使用方式使用技巧:一、wps2017个人版word使用技巧技巧一&#x…

es Update API

2019独角兽企业重金招聘Python工程师标准>>> es Update API 博客分类: 搜索引擎,爬虫 The update API allows to update a document based on a script provided. The operation gets the document (collocated with the shard) from the ind…