java - 'generally accepted' 库中是否存在 FilteringBlockingQueue 的现有实现(Jakarta Commons、Guava、Spring,...?)

标签 java concurrency

jdk中有PriorityBlockingQueue,它可以使用(提供的或默认的)Comparator对元素进行排序。

现在我需要一个 FilteringBlockingQueue,它是一个并发队列,它在给定时间点仅提供基于动态过滤器的元素子集,并且轮询操作不会删除元素但会更改其状态。

更改元素的状态还应该产生一个信号,以便任何等待的线程(在 poll() 调用内)都能够获取该项目并继续。

这个想法是保持一个具有不同分区的并发集合,每个分区都是具有相同状态的元素的子集。

轮询应该通过传递谓词和变元来完成,该变元将在同一原子操作中将元素移动到另一个分区。

这样的东西是否已经存在于“标准”库中(并且它有已知的名称)吗?

编辑:我在这里发现了类似的请求:Java Blocking List Implementation但没有任何接受的答案...

最佳答案

这个问题类似于要求一个FilteringStack:如果数据结构的不同用户通过使用不同的过滤器看到完全不同的行为(例如,每个人看到不同的顶部-the-stack),它真的是一个Stack吗?经典数据结构(及其并发版本)具有明确定义的语义和众所周知的最佳实现。如果更改语义,这些实现将不再起作用。

如果您需要在运行时和每个线程中以线程安全的方式更改排序和过滤器,我建议使用内存数据库,例如 HSQLDB、H2 或 Derby。您还可以通过使用 objectdb 来避免从对象到关系格式映射的开销,反之亦然。

或者,您可以编写自己的实现,但请注意,快速且安全的多线程代码很难编写。只有当明确性能实际上是一个瓶颈时,我才会写它。

关于java - 'generally accepted' 库中是否存在 FilteringBlockingQueue 的现有实现(Jakarta Commons、Guava、Spring,...?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583445/

相关文章:

java - JFrame 很小

java - 动态添加对象到数组

java - 当获取设置了超时的 Future 结果时,哪里抛出了异常?

JavaFX ChangeListener 并不总是有效

java - 在 ConcurrentHashMap 上进行的操作是线程安全的吗?

java - Mybatis 在 spring 中使用 xml 配置返回大结果

java - WELD-000072 声明钝化范围的托管 bean 必须具有钝化能力

concurrency - 并发编程和并行编程一样吗?

java - 列出已解析的 SQL SELECT 语句的所有表/列

java - 在 Java 中如何更改 ArrayBlockedQueue 的长度?