Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程池中的实际线程创建_Java_Multithreading_Pool - Fatal编程技术网

Java 线程池中的实际线程创建

Java 线程池中的实际线程创建,java,multithreading,pool,Java,Multithreading,Pool,如果我有一个固定大小的线程池,它将在何时调用thread.start()来启动线程?(它会在创建时启动它们吗?还是等到我开始提交任务时再启动?如果您创建一个固定大小的线程池,如下所示: ExecutorService es = Executors.newFixedThreadPool(5); 最初没有创建线程。提交第一个任务时,只创建一个线程(名为“pool-1-thread-1”) 对于每个额外提交的任务,将创建一个新线程,其大小不超过指定的固定大小(本例中为5),即使这些任务实际上不是并行

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

如果您创建一个固定大小的线程池,如下所示:

ExecutorService es = Executors.newFixedThreadPool(5);
最初没有创建线程。提交第一个任务时,只创建一个线程(名为“pool-1-thread-1”)

对于每个额外提交的任务,将创建一个新线程,其大小不超过指定的固定大小(本例中为5),即使这些任务实际上不是并行运行的

例如,如果仅提交3个任务,则将仅创建3个具有以下名称的线程:

池-1-线程-1
池-1-线程-2
池-1-线程-3

此优化非常重要,因为创建新线程是一项资源繁重的操作

使用
LockSupport.Park
方法将当前未执行任务的任何线程置于等待模式

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

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


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

我对您的问题不是很清楚。我认为此答案可能重复,这将得益于一些参考或支持细节。(是否在某个地方指定了此行为?是否在所有JDK实现中都是如此?)格雷:我不理解你的评论。你是说你已经看过了一个特定的JDK实现的源代码,并确认VSTROM编码器的解释准确地描述了该实现的行为吗?如果是的话,请考虑编辑答案来指明你已经确认的特定JDK实现。正确(并带有相关代码的链接)。是的,我有@ruakh。例如,任何sun开发工具包都有src.zip。可以从这里接收openjdk源代码:不幸的是,这些代码都是不可链接的。我想对于
Executors.newFixedThreadPool(…)
不仅调用构造函数调用
ThreadPoolExecutor
或其他类,还可以启动线程,但如果是这样的话,这是我从未见过的JDK变体。