2010-09-29 53 views
1

在我的應用程序中,我使用ExecutorService進行異步調用。在使用ExecutorService時「刷新」固定大小的線程池

ExecutorService executorService = Executors.newFixedThreadPool(10); 

我只在應用程序(基於web)關閉時關閉executorService。最近在調試一些問題時,我正在查看這段代碼,並想知道當我強制關閉ExecutorService並重新啓動它時,在程序執行過程中是否會出現這種情況,即新的池式線程集。所以我想知道典型的場景/意想不到的應用行爲會迫使我這樣做?

我檢查的典型例外是ExecutionException, InterruptedException, CancellationException,但除記錄它們之外,我沒有做太多的工作。

+0

你問是否有服務引發的異常表明你需要「重新啓動」它嗎?或者你是否問過在外部應用程序行爲期間是否需要重新啓動執行程序服務?你是否看到似乎表明執行程序服務中的線程不再運行的行爲? – Gray 2010-09-29 15:00:35

回答

1

一般的答案是,你不應該回收池;它旨在最大限度地減少您的需要。您可能要考慮兩種情況:

  • 在你的任務之一突然的未處理的異常。在這種情況下,任務將失敗(並且您可以選擇通過線程池鉤子捕獲未處理的異常,或者可以退出工作線程)。但是,線程池可以乾淨地處理這個問題,並且如果需要,下一個到線程池的請求將創建一個替換。

  • 工作線程死鎖。這一點不容易預測或檢測 - 我無法想象構建一個應用程序圍繞回收線程池來應對死鎖的工作線程。

除了這兩個邊緣條件,我沒有理由擔心定期循環到新的線程池。

有些人創建和銷燬線程池,因爲他們不知道的CompletionService,方便的方法,如invokeAll()和監控完成與Future S上的靈活性。