执行程序线程不会终止

时间:2011-06-06 13:17:08

标签: java executors

我正在使用Executors.newFixedThreadPool(100)方法。 单个命令执行需要大约20个线程。执行5-6次命令后,应用程序停止响应。 我的线程正在实现Callable。

我怀疑,该线程在完成后不会终止。 我还调用了shutdown()来终止线程。

任何人都可以告诉我,当我使用get()方法来检索线程的结果时,它是否会被终止(意味着,它从队列中删除),或者它仍然存在于队列中,池用于存储线程。

4 个答案:

答案 0 :(得分:3)

线程不会终止。会发生什么:

  • 所有工作线程都在等待输入队列
  • 一个线程从队列中弹出head元素
  • 它运行Callable
  • 将结果推送到结果队列
  • 等待输入队列中的新元素

因此结果队列溢出或Callable未返回。

答案 1 :(得分:1)

  1. 即使在调用get()之后,该线程仍然在队列中。事实上,API确保即使线程死亡,它也会重新创建一个线程以保持“固定性”(在池中修复没有线程)

  2. 请注意,如果池中的线程实际上正在执行某项任务(除了等待),则调用shutdown将不会终止该线程。因此,对于例如如果你的线程处于无限循环中,那么调用shutdown是没用的。

答案 2 :(得分:1)

get()是一个阻塞调用 - 这意味着调用线程会停止,直到正在运行的线程完成其任务并且结果可用。

Executor负责从队列中取出任务并清理,所以答案是“不” - 它不是“仍然在队列中”

小心使用100个线程 - 这是一个非常高的数字。对于典型的机器,尝试2到8之间(所有这些都取决于等待其他事情所花费的时间,例如I / O - 您的任务的CPU限制越多,您应该使用的线程越少。

答案 3 :(得分:0)

调用shutdown()只会阻止线程池接受新任务,并允许所有线程在执行完所有任务后完成。

您有多少个核心?如果你有100个繁忙的线程,并说4个核心,每个线程只会获得少量的CPU时间。