我需要一个阻塞对象来触发一些事件。(单个)消费者应该等待触发发生。然后它会做一些事情。然后它再次等待触发。触发器由多个不同的线程(生产者)激活。但是生产者不产生任何数据。这种触发器的语义是:“消费者必须做某事”(例如重新计算一些值,因为底层数据发生了变化)。这意味着即使触发器被多次激活,它也应该作为单个触发器出现在消费者面前。
我考虑过使用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
?
ABlockingQueue
似乎合适,但如果队列已满,我没有找到将其限制为单个内容对象而不阻塞生产者的方法。