我对生产者-消费者模式的理解是,可以使用一个队列来实现生产者和消费者之间的共享。生产者将工作提交到共享队列中,消费者获取并处理它。也可以通过生产者直接向消费者提交来实现(生产者线程直接向消费者的执行器服务提交)。
现在,我一直在研究Executors类,它提供了一些常见的线程池实现。据规范介绍,newFixedThreadPool方法“重用一组固定数量的线程,并且这些线程以无界队列为基础运行”。这里所说的队列是哪个?
如果生产者直接向消费者提交任务,那么它是否是ExecutorService的内部队列,其中包含了可运行的任务列表?
或者,如果生产者提交给共享队列,那么它是否是中间队列?
也许我错过了整个重点,但请有人澄清一下吗?
现在,我一直在研究Executors类,它提供了一些常见的线程池实现。据规范介绍,newFixedThreadPool方法“重用一组固定数量的线程,并且这些线程以无界队列为基础运行”。这里所说的队列是哪个?
如果生产者直接向消费者提交任务,那么它是否是ExecutorService的内部队列,其中包含了可运行的任务列表?
或者,如果生产者提交给共享队列,那么它是否是中间队列?
也许我错过了整个重点,但请有人澄清一下吗?
ExecutorService
只是一个接口。你可以使用一个类来实现ExecutorService
,该类会在提交时立即在同一线程中运行每个可运行对象(我相信在java.util.concurrent
包中有这样的实现)。但是,在实践中,大多数ExecutorService
实现都是完整的生产者-消费者实现。 - Daniel Prydensubmit()
新的Runnable
都会被阻塞,直到至少有一个任务完成并且队列中再次有空间。这对于限制生产者线程的速率非常有用。在某些情况下,您不希望生产者线程永远被阻塞,在这种情况下,您可能需要一个无界队列。 - Daniel Pryden