在从 Socket 连接读取项目的 Java 应用程序中,我需要(出于此处未进一步概述的原因)
- 输入项由单个线程处理,以便保留其顺序。
- 在处理之前要缓冲的输入项,以便在其他项仍在处理时可以从套接字读取新项。
- 只要缓冲区已满,读取线程就会被阻塞
所以实际上我想使用单个工作线程来处理从套接字接收到的缓冲项目。还有一个合适的队列作为工作线程和读取线程之间的缓冲区,这将是一种具有 FIFO 容量的公平的 SynchronousQueue
。
所需队列的行为应类似于 ArrayBlockingQueue
或 LinkedBlockingQueue
,在未满时具有容量,并且在满时类似于 SynchronousQueue
意味着
put
放入队列只会在队列已满时阻塞线程take
仅当队列为空时才会阻塞线程take
在一个已满的队列上将为调用者提供下一个 FIFO 元素,并解除阻塞并从等待put
操作的下一个线程插入该元素put
放在空队列上会将元素移交给在poll
操作中等待的线程,或者将其插入
是否有任何已知的类似实现,或者我是否必须推出自己的实现?
最佳答案
一个答案不仅仅是试图从那些建议 ArrayBlockingQueue 的发帖者那里窃取分数:
两个 ArrayBlockingQueue。一个充当“池队列”——在启动时填充缓冲区对象。另一个用于处理线程等待工作。
套接字线程必须先从池中获取缓冲区,然后再加载数据并将其排队到处理线程。处理线程在处理数据后,最终必须将“已用”对象返回到池中。如果池为空,则套接字线程将在其上阻塞,直到返回一些缓冲区为止。
这提供了与有界处理队列相同的流量控制,但具有避免缓冲区上的 GC 的额外优势。
关于java - 是否存在像 SynchronousQueue 这样具有容量的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905504/