原文地址:
https://dzone.com/articles/di...面试
BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,可是常常对咱们形成困扰。若是须要分析线程dump必需要对其有必定的理解。使用生活的例子,本文将每一个状态变成了简单的例子。微信
与正式的Java文档定义相比,任何让人费解的概念均可以用简单的例子来理解。若是用真实生活中的例子,就更好理解了。我想分享一些真实生活的例子来帮助理解这些线程状态。工具
http://fastthread.io/assets/i...spa
图: 采用http://fastthread.io/生成的状态图展现了哪些线程被哪些线程阻塞.net
Java文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”线程
真实生活例子:今天你要去面试。这是你梦想的工做,你已经盯着它多年了。你早上起来,准备好,穿上你最好的外衣,对着镜子打理好。当你走进车库发现你的老婆已经把车开走了。在这个场景,你只有一辆车,因此怎么办?在真实生活中,可能会打架:-)。 如今由于你老爸把车开走了你被BLOCKED了。你不能去参加面试。对象
这就是BLOCKED状态。用技术术语讲,你是线程T1,你老婆是线程T2而锁是车。T1被BLOCKED在锁(例子里的车)上,由于T2已经获取了这个锁。blog
小贴士:当线程调用Object#wait()方法进入一个synchronized块/方法或重进入一个synchronized锁/方法时会等待获取monitor锁。图片
Java文档官方定义WAITING状态是:“一个线程在等待另外一个线程执行一个动做时在这个状态”ip
真实生活例子:再看下几分钟后你的老婆开车回家了。如今你意识到快到面试时间了,而开车过去很远。因此你拼命地踩油门。限速120KM/H而你以160KM/H的速度在开。很不幸,一个交警发现你超速了,让你停到路边。如今你进入了WAITING状态。你听下车坐在那等着交警过来检查你并放行。基本上,只有等他让你走,你被卡在WAITING状态了。
用技术术语来说,你是线程T1而交警是线程T2。你释放你的锁(例子中你停下了车),并进入WAITING状态,直到警察(例子中T2)让你走,你陷入了WAITING状态。
小贴士:当线程调用如下方法时会进入WAITING状态:
Object#wait() 并且不加超时参数
Thread#join() 并且不加超时参数
LockSupport#park()
在对象上的线程调用了Object.wait()会进入WAITING状态,直到另外一个线程在这个对象上调用了Object.notify()或Object.notifyAll()方法才能恢复。一个调用了Thread.join()的线程会进入WAITING状态直到一个特定的线程来结束。
Java文档官方定义TIMED_WAITING状态为:“一个线程在一个特定的等待时间内等待另外一个线程完成一个动做会在这个状态”
真实生活例子:尽管充满戏剧性,你在面试中作的很是好,惊艳了全部人并得到了高薪工做。(祝贺你!)你回家告诉你的邻居你的新工做并表达你激动的心情。你的朋友告诉你他也在同一个办公楼里工做。他建议你坐他的车去上班。你想这不错。因此第一天,你走到他的房子。在他的房子前停好你的车。你等了10分钟,但你的邻居没有出现。你继续开本身的车去上班,这样你不会在第一天就迟到。这就是TIMED_WAITING.
用技术术语来解释,你是线程T1而你的邻居是线程T2。你释放了锁(这里是中止开车)并等了足足10分钟。若是你的邻居T2没有来,你继续开车。
小贴士:调用了如下方法的线程会进入TIMED_WAITING:
Thread#sleep()
Object#wait() 并加了超时参数
Thread#join() 并加了超时参数
LockSupport#parkNanos()
LockSupport#parkUntil()
当人们分析thread dump时,理解这些不一样的线程状态很关键。
有多少线程在RUNNABLE,BLOCKED,WAITING和TIMED_WAITING状态?哪个线程被阻塞了?谁在阻塞别人?哪个对象被锁了?这些都是很重要的度量分析线程状态的东西。这些线程分析的细节均可以很容易地用线上分析工具http://fastthread.io/完成。
本文来自微信公众号「麦芽面包」,id「darkjune_think」
转载请注明。长按图片识别二维码关注。
交流Email: zhukunrong@yeah.net