面试问题——阻塞和等待状态的区别

面试问题——阻塞和等待状态的区别

来源

转至: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()

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值