gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:14:00 26 4
gpt4 key购买 nike

在从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com