Java:线程池如何将线程映射到runnables

时间:2012-04-30 01:00:30

标签: java concurrency

试图理解Java并发性,并且很难理解线程池,线程和正在执行的可运行“任务”之间的关系。

如果我用10个线程创建一个线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化线程实际上只是与任务无关的“工作者无人机”可用于执行任何线程任务?

无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程?

2 个答案:

答案 0 :(得分:7)

通常,线程池使用一个生产者 - 消费者队列实现,所有池线程都在等待任务。 Executor不必分配任务,它所要做的就是将它们推送到队列中。某个线程,一个“与任务无关的工作人员无人机”,将弹出任务,执行其'run()'方法,并在完成后循环再次等待队列以进行更多工作。

答案 1 :(得分:2)

  

如果我用10个线程创建一个线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化线程实际上只是与任务无关的“工作者无人机”可用于执行任何线程任务?

或多或少后者。任何给定的任务都被分配给下一个可用的线程。

  

无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程?

没有“正确”的线程。需要设计任务(即Runnable),以便哪个线程运行它并不重要。这通常不是问题...假设您的应用程序正确地同步对多个线程可能使用的数据的访问/更新。