Oxf*_*ord 7 java concurrency multithreading producer-consumer executors
我对生产者 - 消费者模式的理解是,它可以使用生产者和消费者之间共享的队列来实现.生产者将工作提交给共享队列,消费者检索它并处理它.它也可以由生产者直接提交给消费者来实现(生产者线程直接提交给Consumer的执行者服务).
现在,我一直在查看Executors类,它提供了一些线程池的常见实现.根据规范,方法newFixedThreadPool"重用在共享无界队列中运行的固定数量的线程".他们在这里谈论哪个队列?
如果Producer直接向使用者提交任务,那么它是包含Runnables列表的ExecutorService的内部队列吗?
或者它是中间队列,以防生产者提交到共享队列?
可能是我错过了重点,但请有人澄清一下吗?
你是对的,ExecutorService
它不仅仅是一个线程池,而且是一个完整的生产者-消费者实现。这个内部队列实际上是一个线程安全的队列Runnable
(FutureTask
准确地说)保存着您的任务submit()
。
池中的所有线程都被阻塞在该队列上,等待任务执行。当您submit()
执行一项任务时,只有一个线程会拿起它并运行它。当然submit()
不是等待池中的线程完成处理。
另一方面,如果您提交大量任务(或长时间运行的任务),您可能最终会导致池中的所有线程都被占用,并且一些任务在队列中等待。一旦任何线程完成其任务,它将立即从队列中选择第一个线程。