2012-12-18 58 views
0

我正在編程我的系統編程課程作業(使用線程)。Java ThreadPoolExecutor - 關閉特定的線程?

我的活動類實現Runnable,而且我還有一個類執行該Runnable使用執行人:ThreadPoolExecutor e = (ThreadPoolExecutor) Executors.newFixedThreadPool(number);

我在該線程池同時運行多個線程。我的問題如下:我可以選擇知道一個線程什麼時候完成了它的工作,關於它需要做什麼,我怎麼能關閉這個線程,並且 - 只有這個線程,而不是整個執行程序?

+0

如果你沒有關閉這個線程,它不立即做任何事情會有什麼不同? –

+0

因爲我想要另一個線程正在等待它的'地方? – TheNotMe

+0

你沒有看到發生?如果是這種情況,我建議你得到另一個操作系統。 Windows和Unix將始終停止空閒線程並啓動等待運行的線程。 –

回答

1

ThreadPoolExecutor負責管理其線程,並且您無法訪問它們,除非通過一些可能會破壞執行程序的醜陋黑客。你應該使用的是API提供的配置選項,如setKeepAliveTime或接受keepAliveTime的構造函數。將其設置爲零,並自動獲得所需的行爲。

+0

對不起,請問我能進一步解釋嗎?我不瞭解setKeepAliveTime的java文檔。 它是做什麼的?是關於游泳池或整個游泳池中的某個線程?以及爲什麼如果我將它設置爲零,它會讓我自動獲得我想要的行爲? – TheNotMe

+0

它會殺死所有無關的線程。 –

+0

但不是正在等待的線程。我對麼? – TheNotMe

0

如果我明白你想要正確的是newCachedThreadPool而不是newFixedThreadPool

從Java文檔

創建一個可根據需要創建新線程的線程池,但將重用以前構造的線程,當他們可用。這些池通常會提高執行許多短暫異步任務的程序的性能。調用執行將重用以前構造的線程(如果可用)。如果沒有現有線程可用,則會創建一個新線程並將其添加到池中。 未使用六十秒的線程被終止並從緩存中移除。因此,保持閒置時間足夠長的池不會消耗任何資源。請注意,可能使用ThreadPoolExecutor構造函數創建具有類似屬性但具有不同細節的池(例如,超時參數)。

+0

如果它不會自動擴展它的「線程數量」,這將是完美的,因爲在我的任務中,我必須親自檢查它。 – TheNotMe