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

Java 是否存在像SynchronousQueue这样的具有容量的实现?,java,multithreading,queue,Java,Multithreading,Queue,在从套接字连接读取项目的Java应用程序中,我需要 输入要由单个线程处理的项,以便保留它们的顺序 处理前要缓冲的输入项,以便在处理其他项时可以从套接字读取新项 只要缓冲区已满,读取线程就会被阻塞 所以实际上我想使用一个工作线程来处理从套接字接收的缓冲项。以及一个合适的队列作为工作线程和读取器线程之间的缓冲区,这将是一种具有FIFO容量的公平同步队列 所需队列的行为应类似于ArrayBlockingQueue或LinkedBlockingQueue,容量未满时与SynchronousQueue相同

在从套接字连接读取项目的Java应用程序中,我需要

  • 输入要由单个线程处理的项,以便保留它们的顺序
  • 处理前要缓冲的输入项,以便在处理其他项时可以从套接字读取新项
  • 只要缓冲区已满,读取线程就会被阻塞
  • 所以实际上我想使用一个工作线程来处理从套接字接收的缓冲项。以及一个合适的队列作为工作线程和读取器线程之间的缓冲区,这将是一种具有FIFO容量的公平
    同步队列

    所需队列的行为应类似于
    ArrayBlockingQueue
    LinkedBlockingQueue
    ,容量未满时与
    SynchronousQueue
    相同,满时意味着

  • put
    在队列上仅当队列已满时才会阻止线程
  • 队列上的
  • 仅当队列为空时才会阻止线程
  • take
    在一个完整的队列上,将给调用者下一个FIFO元素,并从等待
    put
    操作的下一个线程中取消阻塞和插入该元素
  • put
    在空队列上将元素交给
    poll
    操作中等待的线程,或者插入它

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

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

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

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


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

    它与
    ArrayBlockingQueue
    有何不同?您能否澄清这与
    ArrayBlockingQueue
    有何不同?如果没有可用的线程,带有SynchronousQueue的ExecutorService也不会阻塞。@PeterLawrey是的,你是对的
    ThreadPoolExecutor
    实际上不使用
    put
    而是
    offer
    。因此,将
    ThreadPoolExecutor
    与单个线程以及
    SynchronousQueue一起使用似乎没有任何意义。我在文章中阐明,我必须使用自己的工作线程来反复
    轮询队列中的项目。@你说得对!我被一个
    BlockingQueue
    提供的插入/删除项目的不同方法弄得一团糟,这似乎正是我所需要的。任何先写答案的人都会被接受;)另外,在多个线程上处理bufer对象并不太困难。如果每个线程在被推送到队列之前都获得了递增的序列号,则可以在处理完成时对多个线程的输出重新排序。需要一个容器来存放等待早期对象到达的对象。