【发布时间】:2013-10-15 21:30:53
【问题描述】:
我需要一个阻塞对象来触发一些事件。 (单个)消费者应该等待触发发生。然后它会做一些事情。然后它再次等待触发。 触发器由多个不同的线程(生产者)激活。但是生产者不产生任何数据。这种触发器的语义是:“消费者必须做某事”(例如重新计算一些值,因为底层数据发生了变化)。 这意味着即使触发器被多次激活,它也应该作为单个触发器出现在消费者面前。
我考虑过使用CountDownLatch 或ArrayBlockingQueue,但它们似乎不合适。
这是我想使用的触发器构造:
public class Trigger{
private final MagicBlockingObject blockingLatch;
public void trigger(){
//activate the blockingLatch, so that a call to waitForTrigger() returns
}
public void waitForTrigger(){
//read from the blockingLatch. This should block until trigger() is called.
}
}
对MagicBlockingObject 使用什么有任何想法?
BlockingQueue 似乎合适,但如果队列已满,我没有找到将其限制为单个内容对象而不阻塞生产者的方法。
【问题讨论】:
-
我想你在找
java.util.concurrent.locks.Condition -
在这种情况下同步到简单吗?
-
您只需简单地使用 synchonize 和 wait()、notify() 调用即可。
-
“如果触发器被多次激活,它应该对消费者显示为单个触发器” - 这是非常危险的设计决策,因为某些激活被忽略了。您必须三思而后行触发器被消费者清除的方式/时间,因为它会影响哪些激活被忽略。
-
@AlexeiKaigorodov 我不这么认为。你在哪里看到问题?触发器不会被消费者手动清除,而只会被消费。在通知消费者之前,无论是 1 个还是 10 个生产者激活了触发器都没有关系。您在 Duncan Jones 解决方案中发现任何问题吗?
标签: java multithreading blocking