试图理解Java并发性,并且很难理解线程池,线程和正在执行的可运行“任务”之间的关系。
如果我用10个线程创建一个线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化线程实际上只是与任务无关的“工作者无人机”可用于执行任何线程任务?
无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程?
答案 0 :(得分:7)
通常,线程池使用一个生产者 - 消费者队列实现,所有池线程都在等待任务。 Executor不必分配任务,它所要做的就是将它们推送到队列中。某个线程,一个“与任务无关的工作人员无人机”,将弹出任务,执行其'run()'方法,并在完成后循环再次等待队列以进行更多工作。
答案 1 :(得分:2)
如果我用10个线程创建一个线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化线程实际上只是与任务无关的“工作者无人机”可用于执行任何线程任务?
或多或少后者。任何给定的任务都被分配给下一个可用的线程。
无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程?
没有“正确”的线程。需要设计任务(即Runnable
),以便哪个线程运行它并不重要。这通常不是问题...假设您的应用程序正确地同步对多个线程可能使用的数据的访问/更新。