我在我的应用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)
。这是一个静态变量。执行者服务多线程
corePoolsize
是10个主题。假设所有10个线程当前都在分配任务下运行。我想知道如果我再创建一个任务并尝试运行它,会发生什么情况。
我试过在我的系统中,但我看到的是任务运行时没有任何问题。
我在我的应用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)
。这是一个静态变量。执行者服务多线程
corePoolsize
是10个主题。假设所有10个线程当前都在分配任务下运行。我想知道如果我再创建一个任务并尝试运行它,会发生什么情况。
我试过在我的系统中,但我看到的是任务运行时没有任何问题。
直接的Javadoc采取
如果有其他任务提交时的所有线程是活动的,他们将在队列中等待,直到一个线程可用
当您提交时,新任务所有线程当前都处于活动状态,它将以FIFO方式添加到队列中,并在一个线程可用时处理。这个队列是无限的,所以它可以容纳的最大元素是Integer.MAX_VALUE
。
这在Javadoc的回答为Executors.newFixedThreadPool
:
如果当所有线程是活动的其他任务提交,他们将在队列中等待,直到一个线程可用。如果任何线程在关闭之前的执行期间由于失败而终止,则如果需要执行后续任务,则将取代它。
您的系统通常具有多个处理器。 这就是为什么你无法看到任何区别。
即使您提到线程池为10,线程实际上是由JVM均匀分配到系统中的所有处理器。 因此,用于存储即将到来的任务的队列永远不会满足只有10个线程。
我想;即使使用Integer.MAX_VALUE任务数量,等待队列也不会完全加载,因为多个处理器会占用任务并在其中分配。
如果提交的新工作比他们能够完成的更快? – tddmonkey
@Rashmi必须发送低负载任务,这就是为什么她无法看到任何区别。 – AnirbanDebnath
我想;即使使用Integer.MAX_VALUE任务数量,等待队列也不会完全加载,因为多个处理器会占用任务并在其中分配。 – AnirbanDebnath
正如我已经评论你的答案,这使得工作完成得比他们提交的要快 – tddmonkey
@MrWiggles其他答案?为什么会做出这样的假设?如果他们提交的工作没有尽快完成,他们会被添加到队列中,这就是我所说的。 – Tunaki