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

简介: 翻译原文地址: https://dzone.com/articles/difference-between-blocked-waiting-timed-waiting-e BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,但是经常对我们造成困扰。如果需要分析线程dump必须要对其有一定的理解。使用生活的例子,本文将每个状态变成了简单的例子。 与正式的Jav

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

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

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

image.png

图: 采用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/完成。

目录
相关文章
|
7月前
|
设计模式 Java 调度
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
92 1
|
29天前
sleep()和wait()的区别
(1)wait()是Object的方法,sleep()是Thread类的方法 (2)wait()会释放锁,sleep()不会释放锁 (3)wait()要在同步方法或者同步代码块中执行,sleep()没有限制 (4)wait()要调用notify()或notifyall()唤醒,sleep()自动唤醒
21 5
sleep () 和 wait () 的区别
sleep () 和 wait () 的区别
92 0
|
监控
Sleep()和wait()方法的区别
Sleep()和wait()方法的区别
140 0
|
Java 程序员
sleep 和 wait 的区别
Java 中,线程的 "sleep" 和 "wait" 方法区别
134 0
|
Java 调度
Java中线程的6种状态详解(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)
Java中线程的6种状态详解(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)
433 0
线程 - wait & sleep 区别
线程 - wait & sleep 区别
122 0
|
Java
sleep与wait区别
第一个区别是在对系统资源的占用上。 wait是Object类的一个函数(也就意味着所有对象都有这个函数),指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(当然这两个同时也是Object的函数)。 而sleep则是Thread类的一个函数,指线程被调用时,占着CPU不工作。此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
149 0
|
监控
sleep 与 wait 区别
sleep 与 wait 区别
121 0