存在具有容量的SynchronousQueue等实现?

时间:2012-08-10 16:13:58

标签: java multithreading queue

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

  1. 输入要由单个线程处理的项目,以便保留其顺序。
  2. 在处理之前输入要缓冲的项目,以便可以从套接字中读取新项目,而其他项目仍在处理中。
  3. 只要缓冲区已满,
  4. 要阻止的读取线程
  5. 所以实际上我想使用一个工作线程处理从套接字接收的缓冲项。一个拟合队列作为工作线程和读者线程之间的缓冲区,这将是一种具有FIFO容量的公平SynchronousQueue

    所需的队列应该像ArrayBlockingQueueLinkedBlockingQueue一样具有容量而不是已满并且与SynchronousQueue类似,当满意时

      队列中的
    1. put仅在队列已满时阻止线程
    2. 队列中的
    3. take仅在队列为空时阻止线程
    4. 完整队列中的
    5. take将为调用者提供下一个FIFO元素,并在put操作中等待并插入等待下一个线程的元素
    6. 空队列上的
    7. put会将元素移交给poll操作中的线程等待或插入
    8. 有没有这样的已知实现,还是我必须推出自己的实现?

1 个答案:

答案 0 :(得分:1)

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

两个ArrayBlockingQueues。一个充当游泳池队列' - 启动时填充缓冲区对象。另一个是处理线程等待工作。

套接字线程在加载数据并将其排队到处理线程之前必须从池中获取缓冲区。处理完数据后,处理线程最终必须返回使用过的'对象回到游泳池。如果池清空,则套接字线程会阻塞它,直到返回一些缓冲区为止。

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