2011-06-06 188 views
0

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

我怀疑,那个线程在完成后没有终止。我也调用shutdown()来终止线程。

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

回答

3

的线程不终止会发生什么情况是这样的:。

  • 所有工作线程等待输入队列
  • 一个线程弹出从队列头部元素
  • 它运行Callable
  • 它推动的结果到结果队列
  • 它在等待一个新的元素输入队列

因此,结果队列溢出或您的Callable不会返回。

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

  2. 请注意,如果池中的线程实际上正在执行一些任务),调用shutdown不会终止线程。所以,对于例如如果你的线程处于无限循环中,那么调用shutdown是没有用的。

+0

采取线程转储...大声笑 – mre 2011-06-06 13:24:22

+0

感谢您的答复。我更关心的是,当我调用get()并从调用中得到结果时,线程已从队列中移除,或者仍然占用队列中的空间。 – Raman 2011-06-06 13:26:16

+0

编辑答案将其添加。 – 2011-06-06 13:31:00

1

get()是一个阻塞调用 - 这意味着调用线程暂停,直到正在运行的线程已经完成了它的任务,其结果是可用的。

执行人采取的从队列中取任务并清理照顾,所以答案是“不” - 这是不是“仍然在队列中”使用100个线程

注意 - 这是一个高得离谱的数字。对于典型的机器,尝试在2到8之间(全部取决于等待其他事情花费了多少时间,例如I/O - 任务所占用的CPU越多,应该使用的线程越少)

0

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

您有多少个内核?如果有100个忙线程,并且说每个线程只有4个内核得到的CPU少量时间