java - 带谓词的生产者-消费者

标签 java multithreading concurrency producer-consumer

我正在寻找一个支持谓词阻塞 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/

相关文章:

java - 如何验证实例字段值?

c# - 如何使类只允许创建 3 个对象

java - 配置 Eclipse 项目的构建路径

java - 当我只创建了两个线程时,为什么 `ps` 会列出 > 2 个 Java 线程/"light-weight processes"?

java - java中的http负载生成器

java - IdentityMapCapacity 在架构注册表中意味着什么

在Android中,当OP_WRITE存在时,Java nio OP_READ不执行?

ios - 核心数据 在后台导入数据并回滚

jakarta-ee - JPA 实体的 transient 字段是否需要并发同步?

ios - 使用dispatch_group_async的并发代码的性能比单线程版本慢很多