如果我有一个固定大小的线程池,它何时会实际调用Thread.start()
来启动线程? (它会在创建时启动吗?还是会等到我开始提交任务?)
答案 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.我还没有检查过其他实现。