0

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

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

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

所需的队列应该表现得像一个ArrayBlockingQueueor LinkedBlockingQueuewith capacity while not full 并且类似于一个SynchronousQueuewhen full 意思是

  1. puton queue 只会在队列已满时阻塞线程
  2. takeon queue 只会在队列为空时阻塞线程
  3. take在一个完整的队列上将给调用者下一个 FIFO 元素并解除阻塞并插入来自下一个线程等待put操作的元素
  4. put在空队列上,要么将元素交给线程等待poll操作,要么将其插入

有没有这样的已知实现,还是我必须推出自己的?

4

1 回答 1

1

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

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

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

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

于 2012-08-10T18:15:39.387 回答