执行程序服务多线程

时间:2015-12-02 10:00:45

标签: java multithreading threadpool executorservice

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

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

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

4 个答案:

答案 0 :(得分:2)

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

Executors.newFixedThreadPool的Javadoc中回答了这个问题:

  

如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用。如果任何线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程。

答案 1 :(得分:1)

直接从Javadoc

获取
  

如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用

答案 2 :(得分:-1)

的Javadoc

  

在任何时候,最多" nThreads"线程将是活动的处理任务。

由于某些异常,可能是您先前执行的任务已被终止。

答案 3 :(得分:-1)

您的系统通常有多个处理器。 这就是为什么你看不出任何差异的原因。

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

我猜;即使使用Integer.MAX_VALUE个任务,等待队列也不会被完全加载,因为多个处理器会占用任务并相互分开。