我需要一个阻塞对象来触发一些事件。 一个(单个)消费者应该等待触发发生。然后它会做一些事情。然后它再次等待触发。 触发器由多个不同的线程(生产者)激活。但是生产者不产生任何数据。这种触发器的语义是:“消费者必须做某事”(例如重新计算一些值,因为底层数据发生了变化)。 这意味着即使触发器被多次激活,它也应该作为单个触发器出现在消费者面前。
我考虑过使用 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
似乎是合适的,但我没有找到一种方法将其限制为单个内容对象而不阻塞生产者,如果队列已满。
最佳答案
您可以使用容量为 1 的 ArrayBlockingQueue
解决此问题:
public class Trigger{
private final ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
public void trigger(){
queue.offer("foo");
}
public void waitForTrigger(){
queue.take();
}
}
关于java - 使用什么阻塞对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381136/