栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

可以通知多次唤醒同一线程吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

可以通知多次唤醒同一线程吗?

我的回答有一些特定于实现的信息。它基于我对Sun JVM和其他线程库行为的工作知识。

如果两个生产者线程调用notify,是否保证将唤醒两个不同的正在等待的使用者线程?

不它不是。不能保证会有任何消费者醒来。可以保证的是,如果有2个线程在等待,那么会将2个 不同的 线程放入运行队列。

还是

notify()
彼此之间很快触发的两个s导致同一用户线程排队两次唤醒?

否。两次

notify()
调用不会导致同一使用者线程两次排队。但是,这可能会导致一个线程被唤醒,并且可能没有其他线程在等待,因此第二个
notify()
调用可能什么都不做。当然,线程本可以被唤醒,然后又回到等待状态,这样就可以进行第二次
notify()
调用,但是我认为这不是您要的。

Java是否有一些原子内部操作可仅一次唤醒线程?

是。该

Thread
代码具有许多同步点。通知线程后,将其移出
wait
队列。将来的调用
notify()
将进入
wait
队列,但找不到该线程。

还有一点 很重要 。对于生产者/消费者模型,请始终确保您正在

while
循环测试条件。原因是存在与竞争者的竞争条件,这些竞争者被锁定但没有等待条件。

 synchronized (workQueue) {     // you must do a while here     while (workQueue.isEmpty()) {         workQueue.wait();     }     workQueue.remove(); }

Consumer1
可能在等待
workQueue
。
Consumer2
可以
synchronized
在运行队列中被阻止。如果事情被放入
workQueue
和
workQueue.notify()
被调用。
Consumer2
现在进入运行队列,但 落后于
Consumer1
谁先行。这是一个常见的实现。所以,
Consumer1
去在将删除的项目
workQueue
是
Consumer2
被通报的。
Consumer2
必须再次测试是否
workQueue
为空,否则
remove()
将抛出异常,因为队列再次为空。有关比赛的更多详细信息,请参见此处。

同样重要的是要认识到已经记录了虚假

while
唤醒,因此该循环可以防止未经
wait()
调用而唤醒线程。

综上所述,如果您可以通过使用

BlockingQueue
其他答案中建议的减少生产者/消费者代码,则应该这样做。该
BlockingQueue
代码已经解决了所有这些问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号