我在我的应用程序中使用了ExecutorService executor = Executors.newFixedThreadPool(10)
。这是一个静态变量。
corePoolsize
是10个主题。假设所有10个线程当前正在运行并分配了任务。我想知道如果我再创建一个任务并尝试运行它将会发生什么。
我在我的系统中尝试过,但我看到的是任务正在运行而没有任何问题。
答案 0 :(得分:2)
当所有线程当前处于活动状态时提交新任务时,它将以FIFO方式添加到队列中,并在一个线程可用时进行处理。此队列是无限制的,因此它可以容纳的最大元素是Integer.MAX_VALUE
。
在Executors.newFixedThreadPool
的Javadoc中回答了这个问题:
如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用。如果任何线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程。
答案 1 :(得分:1)
直接从Javadoc
获取如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用
答案 2 :(得分:-1)
的Javadoc
在任何时候,最多" nThreads"线程将是活动的处理任务。
由于某些异常,可能是您先前执行的任务已被终止。
答案 3 :(得分:-1)
您的系统通常有多个处理器。 这就是为什么你看不出任何差异的原因。
即使您将线程池提到10,线程实际上也是由JVM均匀分布到系统中的所有处理器。 因此,用于存储即将到来的任务的队列永远不会只有10个线程。
我猜;即使使用Integer.MAX_VALUE个任务,等待队列也不会被完全加载,因为多个处理器会占用任务并相互分开。