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