2011-06-06 187 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少量時間