我正在寻找一个支持谓词阻塞 read()
的 java 集合。我写了一个简单的版本,但看来这一定已经被发明了?
例如:
interface PredicateConsumerCollection<T> {
public void put(T t);
@Nullable
public T get(Predicate<T> p, long millis) throws InterruptedException;
}
put()
将其参数传递给具有匹配谓词的等待消费者,或将其存储在存储中。如果存储中已存在合适的 T
,则 get()
立即返回,或者阻塞直到 put() 找到合适的值,或者超时。消费者之间存在竞争,但在我看来,公平并不重要。
有人知道这样的集合吗?
最佳答案
没有直接的类可以解决您的问题,但 ConcurrentHashMap 和 BlockingQueue 的组合可能是一个解决方案。
HashMap 定义为:
final ConcurrentHashMap<Predicate, LinkedBlockingQueue<Result>> lookup;
put 需要确保每个 Predicate 都有一个队列添加到映射中,这可以使用 putIfAbsent 来线程安全地完成。
如果您有一组固定的谓词,您可以简单地预先填充列表,然后消费者可以简单地调用lookup.get(Predicate).take()
如果谓词的数量未知/太多,您需要为消费者编写等待/通知实现,以防谓词尚未出现在您自己的列表中。
关于java - 带谓词的生产者-消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491215/