java - 是否存在像 SynchronousQueue 这样具有容量的实现?

标签 java multithreading queue

在从 Socket 连接读取项目的 Java 应用程序中,我需要(出于此处未进一步概述的原因)

  1. 输入项由单个线程处理,以便保留其顺序。
  2. 在处理之前要缓冲的输入项,以便在其他项仍在处理时可以从套接字读取新项。
  3. 只要缓冲区已满,读取线程就会被阻塞

所以实际上我想使用单个工作线程来处理从套接字接收到的缓冲项目。还有一个合适的队列作为工作线程和读取线程之间的缓冲区,这将是一种具有 FIFO 容量的公平的 SynchronousQueue

所需队列的行为应类似于 ArrayBlockingQueueLinkedBlockingQueue,在未满时具有容量,并且在满时类似于 SynchronousQueue 意味着

  1. put 放入队列只会在队列已满时阻塞线程
  2. take 仅当队列为空时才会阻塞线程
  3. take 在一个已满的队列上将为调用者提供下一个 FIFO 元素,并解除阻塞并从等待 put 操作的下一个线程插入该元素
  4. put 放在空队列上会将元素移交给在 poll 操作中等待的线程,或者将其插入

是否有任何已知的类似实现,或者我是否必须推出自己的实现?

最佳答案

一个答案不仅仅是试图从那些建议 ArrayBlockingQueue 的发帖者那里窃取分数:

两个 ArrayBlockingQueue。一个充当“池队列”——在启动时填充缓冲区对象。另一个用于处理线程等待工作。

套接字线程必须先从池中获取缓冲区,然后再加载数据并将其排队到处理线程。处理线程在处理数据后,最终必须将“已用”对象返回到池中。如果池为空,则套接字线程将在其上阻塞,直到返回一些缓冲区为止。

这提供了与有界处理队列相同的流量控制,但具有避免缓冲区上的 GC 的额外优势。

关于java - 是否存在像 SynchronousQueue 这样具有容量的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905504/

相关文章:

Java "while != null"将最后一行读取为空

java - 使用 java 流将包含标题和行的 csv 文件转换为 hashmap 数组

Java 同步列表

c++ - _begintheadex函数调用问题

c++ - 由多个线程访问的队列的推荐模式......工作线程应该做什么?

java - 追加到文件并从文件读取,但没有任何反应

java - 为 JButton 添加全局键绑定(bind)?

Java 执行器服务 :- Notify a thread to wake up when an event occurs

c - 2个明显相同的代码!一个编译,一个抛出段错误

go - 在 Go 中实现工作人员池