面试问题——阻塞和等待状态的区别
来源
转至:https://dzone.com/articles/difference-between-blocked-waiting-timed-waiting-e
阻塞
Java 文档将BLOCKED状态正式定义为:“被阻塞等待监视器锁的线程处于此状态。”
现实生活中的例子:今天你要去面试。这是您梦想中的工作,这是您过去几年的目标。你一大早醒来,做好准备,穿上你最好的衣服,在镜子前看起来很锐利。现在你走出车库,意识到你的妻子已经把车开走了。在这种情况下,你只有一辆车,那会发生什么?在现实生活中,可能会发生战斗…在这里你被BLOCKED因为你的妻子已经把车开走了。你将无法参加面试。
这是BLOCKED状态。用技术术语解释一下,你是线程T1,你的妻子是线程T2,锁是汽车。T1在锁(即汽车)上被BLOCKED,因为T2已经获得了这个锁。
花絮:线程在等待监视器锁进入同步块/方法或在调用 Object#wait() 方法后重新进入同步块/方法时,将进入BLOCKED状态。
等待
Java 文档将WAITING状态正式定义为:“无限期等待另一个线程执行特定操作的线程处于此状态。”
现实生活中的例子:假设几分钟后你的妻子开着车回家了。现在你意识到面试时间快到了,开车去那里还有很长的路要走。所以,你把所有的动力都放在汽车的油门上。当允许的速度限制仅为 60 mph 时,您以 100 mph 的速度行驶。你的运气,交警看到你超速驾驶,他把你拉到路边。现在你正在进入WAITING状态,我的朋友。你停止开车,坐在车里,直到警察调查你,然后让你走。基本上,在他让你走之前,你一直停留在WAITING状态。
用技术术语解释它,您是线程T1,警察是线程T2。您松开了锁(即您停止驾驶汽车),并进入WAITING状态。直到警察(即T2)放你走之前,你一直会被困在这个WAITING状态。
Titbit:线程在调用以下方法之一时将进入 WAITING 状态:
1.Object#wait() with no timeout
2.Thread#join() with no timeout
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在 10 分钟内没有出来,你又开始开车了。
Titbit:线程在调用以下方法之一时将进入TIMED_WAITING状态:
1.Thread#sleep()
2.Object#wait() with timeout
3.Thread#join() with timeout
4.LockSupport#parkNanos()
5.LockSupport#parkUntil()