2015-12-02 49 views
0

我在我的应用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)。这是一个静态变量。执行者服务多线程

corePoolsize是10个主题。假设所有10个线程当前都在分配任务下运行。我想知道如果我再创建一个任务并尝试运行它,会发生什么情况。

我试过在我的系统中,但我看到的是任务运行时没有任何问题。

回答

1

直接的Javadoc采取

如果有其他任务提交时的所有线程是活动的,他们将在队列中等待,直到一个线程可用

2

当您提交时,新任务所有线程当前都处于活动状态,它将以FIFO方式添加到队列中,并在一个线程可用时处理。这个队列是无限的,所以它可以容纳的最大元素是Integer.MAX_VALUE

这在Javadoc的回答为Executors.newFixedThreadPool

如果当所有线程是活动的其他任务提交,他们将在队列中等待,直到一个线程可用。如果任何线程在关闭之前的执行期间由于失败而终止,则如果需要执行后续任务,则将取代它。

+0

我想;即使使用Integer.MAX_VALUE任务数量,等待队列也不会完全加载,因为多个处理器会占用任务并在其中分配。 – AnirbanDebnath

+0

正如我已经评论你的答案,这使得工作完成得比他们提交的要快 – tddmonkey

+0

@MrWiggles其他答案?为什么会做出这样的假设?如果他们提交的工作没有尽快完成,他们会被添加到队列中,这就是我所说的。 – Tunaki

-1

的Javadoc

在任何时候,在最 “来确定nthreads” 线程将积极处理任务。

可能是您之前执行的任何任务由于某种异常而终止。

+0

为什么投下了? – PyThon

+0

这绝不会回答OP的问题。他们特别想知道当所有10个线程都忙碌时发生了什么,并且您提交了另一个任务 – tddmonkey

+0

@MWWiggles - 但是她提供的数据不正确,如果已经有10个线程正在执行,附加任务如何启动它们的执行。 – PyThon

-1

您的系统通常具有多个处理器。 这就是为什么你无法看到任何区别。

即使您提到线程池为10,线程实际上是由JVM均匀分配到系统中的所有处理器。 因此,用于存储即将到来的任务的队列永远不会满足只有10个线程。

我想;即使使用Integer.MAX_VALUE任务数量,等待队列也不会完全加载,因为多个处理器会占用任务并在其中分配。

+0

如果提交的新工作比他们能够完成的更快? – tddmonkey

+0

@Rashmi必须发送低负载任务,这就是为什么她无法看到任何区别。 – AnirbanDebnath