我建议您使用BlockingQueue.drainTo(Collection,int)。您可以将其与take()一起使用,以确保获得最少数量的元素。
使用此方法的优点是您的批量大小随工作负载而动态增长,并且生产者不必在消费者忙时阻塞。即,它针对延迟和吞吐量进行了自我优化。
要完全按照要求实现(我认为这是个坏主意),可以将SynchronousQueue与繁忙的消费线程一起使用。
即消费线程做一个
list.clear(); while(list.size() < required) list.add(queue.take()); // process list.
生产者将在消费者忙时阻塞。



