线程池中的实际线程创建

时间:2017-02-08 17:51:05

标签: java multithreading pool

如果我有一个固定大小的线程池,它何时会实际调用Thread.start()来启动线程? (它会在创建时启动吗?还是会等到我开始提交任务?)

1 个答案:

答案 0 :(得分:1)

如果您创建这样的固定大小的线程池:

ExecutorService es = Executors.newFixedThreadPool(5);

最初没有创建任何线程。当您提交第一个任务时,只创建一个线程(它被命名为" pool-1-thread-1"。

对于每个其他提交的任务,创建一个新线程,直到指定的固定大小(在本例中为5),即使这些任务实际上并未并行运行。

例如,如果您只提交3个任务,则只会创建3个具有以下名称的线程: pool-1-thread-1 pool-1-thread-2 pool-1-thread-3

这种优化非常重要,因为创建一个新线程是一项资源密集型操作。

当前未执行任务的任何线程都使用LockSupport.Park方法进入等待模式。

当所有线程忙于执行任务时,其他提交的任务将被放入阻塞队列,等待线程可用。

因此,为了回答您的问题,线程仅在首次提交任务时才开始运行。

此信息适用于JDK 7.我还没有检查过其他实现。