BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释

翻译原文地址:
https://dzone.com/articles/difference-between-blocked-waiting-timed-waiting-e

BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,但是经常对我们造成困扰。如果需要分析线程dump必须要对其有一定的理解。使用生活的例子,本文将每个状态变成了简单的例子。

与正式的Java文档定义相比,任何让人费解的概念都可以用简单的例子来理解。如果用真实生活中的例子,就更好理解了。我想分享一些真实生活的例子来帮助理解这些线程状态。

图: 采用http://fastthread.io/生成的状态图展示了哪些线程被哪些线程阻塞

BLOCKED

Java文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”

真实生活例子:今天你要去面试。这是你梦想的工作,你已经盯着它多年了。你早上起来,准备好,穿上你最好的外衣,对着镜子打理好。当你走进车库发现你的老婆已经把车开走了。在这个场景,你只有一辆车,所以怎么办?在真实生活中,可能会打架:-)。 现在因为你老爸把车开走了你被BLOCKED了。你不能去参加面试。

这就是BLOCKED状态。用技术术语讲,你是线程T1,你老婆是线程T2而锁是车。T1BLOCKED在锁(例子里的车)上,因为T2已经获取了这个锁。

小贴士:当线程调用Object#wait()方法进入一个synchronized块/方法或重进入一个synchronized锁/方法时会等待获取monitor锁。

WAITING

Java文档官方定义WAITING状态是:“一个线程在等待另一个线程执行一个动作时在这个状态”

真实生活例子:再看下几分钟后你的老婆开车回家了。现在你意识到快到面试时间了,而开车过去很远。所以你拼命地踩油门。限速120KM/H而你以160KM/H的速度在开。很不幸,一个交警发现你超速了,让你停到路边。现在你进入了WAITING状态。你听下车坐在那等着交警过来检查你并放行。基本上,只有等他让你走,你被卡在WAITING状态了。

用技术术语来讲,你是线程T1而交警是线程T2。你释放你的锁(例子中你停下了车),并进入WAITING状态,直到警察(例子中T2)让你走,你陷入了WAITING状态。

小贴士:当线程调用以下方法时会进入WAITING状态:

  1. Object#wait() 而且不加超时参数
  2. Thread#join() 而且不加超时参数
  3. LockSupport#park()

在对象上的线程调用了Object.wait()会进入WAITING状态,直到另一个线程在这个对象上调用了Object.notify()或Object.notifyAll()方法才能恢复。一个调用了Thread.join()的线程会进入WAITING状态直到一个特定的线程来结束。

TIMED_WAITING

Java文档官方定义TIMED_WAITING状态为:“一个线程在一个特定的等待时间内等待另一个线程完成一个动作会在这个状态”

真实生活例子:尽管充满戏剧性,你在面试中做的非常好,惊艳了所有人并获得了高薪工作。(祝贺你!)你回家告诉你的邻居你的新工作并表达你激动的心情。你的朋友告诉你他也在同一个办公楼里工作。他建议你坐他的车去上班。你想这不错。所以第一天,你走到他的房子。在他的房子前停好你的车。你等了10分钟,但你的邻居没有出现。你继续开自己的车去上班,这样你不会在第一天就迟到。这就是TIMED_WAITING.

用技术术语来解释,你是线程T1而你的邻居是线程T2。你释放了锁(这里是停止开车)并等了足足10分钟。如果你的邻居T2没有来,你继续开车。

小贴士:调用了以下方法的线程会进入TIMED_WAITING

  1. Thread#sleep()
  2. Object#wait() 并加了超时参数
  3. Thread#join() 并加了超时参数
  4. LockSupport#parkNanos()
  5. LockSupport#parkUntil()

结论

当人们分析thread dump时,理解这些不同的线程状态很关键。
有多少线程在RUNNABLE,BLOCKED,WAITING和TIMED_WAITING状态?哪一个线程被阻塞了?谁在阻塞别人?哪一个对象被锁了?这些都是很重要的度量分析线程状态的东西。这些线程分析的细节都可以很容易地用线上分析工具http://fastthread.io/完成。

时间: 2024-11-02 16:29:04

BLOCKED,WAITING,TIMED_WAITING有什么区别?-用生活的例子解释的相关文章

java-用jstack看到的WAITING和BLOCK的区别的是什么

问题描述 用jstack看到的WAITING和BLOCK的区别的是什么 用jstack看到的WAITING和BLOCK的区别的是什么 解决方案 打开eclipse查看JDK的源码,类java.lang.Thread.State类的注释 /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock *

众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的

问题描述 众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的 2C 众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的

通过生活中例子模拟java面向接口编程实例

包括如下接口和类:   举例,比如一台电脑,主板上的PCI插槽就可以理解为现实中的接口 你可你把声卡,显卡,网卡都插在PCI插槽上,而不用担心那个插槽是专门插哪个的 原因是做主板的厂家和做各种卡的厂家都遵守了统一的规定 包括尺寸,排线等等 但是各种卡的内部实现结构是不一样的. 下面具体模拟:   通过生活中例子模拟java面向接口编程实例 package com.test; /** * 定义PCI接口,定义主板PCI插槽规范 * @author yanerkang * */ public int

通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法

线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂.由此可见线程对于高性能开发的重要性. 那么线程在计算机中有好几种状态,他们之间是怎么切换的?sleep和wait又有什么区别?notify和notifyAll怎么用?带着这些问题,我们来看看Java的线程吧! Thread的状态 先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态: publi

Thread的run()与start()的区别

Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体.通过调用Thread类的start()方法来启动一个线程. 在Java当中,线程通常都有五种状态,创建.就绪.运行.阻塞和死亡. 第一是创建状态.在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 第二是就绪状态.当调用了线

Java中抽象类和接口区别的个人见解

抽象类 抽象类是用来捕捉子类的通用特性的 .它不能被实例化,只能被用作子类的超类.抽象类是被用来创建继承层级里子类的模板.以JDK中的GenericServlet为例: public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {     // abstract method     abstract void service(ServletRequest req, ServletRe

网页制作初学者来看:认识XHTML DHTML SHTML的区别

dhtml|xhtml|初学|区别|网页 我们经常会在一个技术性网站或BBS见到这三个东东:XHTML DHTML SHTML,它们到底是怎么回事呢?我们看下面的说明与讲解. XHTML: HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言,看起来与HTML有些相象,只有一些小的但重要的区别,XHTML就是一个扮演着类似HTML的角色的XML,所以,本质上说,XHTML是一个过渡技术,结合了XML(有几分)的强大功能及HTML(大多数)的简单特性. 2000年底,国际W

[C# 3.0 入门] [第一章 Lambda表达式] 第三节:Lambda与匿名方法的区别

Lambda表达式与匿名方法的区别 那么,为什么Lambda表达式比匿名方法写起来要短呢?这种像变戏法一样的手法真的能用吗?有没有重要信息遗漏掉呢?为了回答这些问题,就让我们把匿名方法和Lambda表达式比较一下,看看Lambda表达式究竟怎么写. 1using System; 2 3delegate int SampleDelegate(int x, int y); 4 5class Program 6{ 7 private static void Calculate(int x, int y

border:none与border:0使用区别

 无边框用border:none还是border:0一直都是一个热议的问题,两者除了在渲染性能上面的差别以为,在标准浏览器中页面表现是没有任何差别的.下面一起认识一下它们本质的区别 一.border:none border-style的简写 在chrome审查元素看到以下结果  代码如下: element.style { border: none; border-top-style: none; border-right-style: none; border-bottom-style: non