存在像同步队列这样具有容量的实现



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

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

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

所需的队列应表现得像具有容量的ArrayBlockingQueueLinkedBlockingQueue,但未满,并且在已满时类似于SynchronousQueue,这意味着

  1. 队列上的put只会在队列已满时阻塞线程
  2. 队列上的take只会在队列为空时阻塞线程
  3. take队列上的 FIFO 将为调用方提供下一个 FIFO 元素,并从在put操作中等待的下一个线程中取消阻止和插入该元素
  4. 空队列上的put会将元素移交给在poll操作中等待的线程或插入它

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

一个答案不仅仅是试图从那些建议使用ArrayBlockingQueue的海报中窃取分数:

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

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

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

最新更新