2016-01-14 59 views
1

我試圖崩潰的標準ExecutorService這個可怕的代碼固定的線程池的線程,以測試其對異常和錯誤傳遞給ExecutorService任務中發生了彈性:有沒有辦法無意中停止Executor的線程?

ExecutorService executorService = Executors.newFixedThreadPool(1); 
    executorService.execute(() -> { 
     throw new RuntimeException("Trying to kill the thread"); 
    }); 
    Thread.sleep(100); 
    executorService.execute(() -> { 
     System.out.println("still executing"); 
    }); 

但第二任務打印still executing,所以我認爲異常被捕獲或Thread實例重新啓動。 發生了什麼?我可以相信,不管在任務內發生了什麼(小於System.exit()),其他提交的任務將繼續由池執行嗎?

+5

這是正確的,在這你應該閱讀的API文檔。 「如果任何線程在關閉之前的執行期間由於失敗而終止,那麼如果需要執行後續任務,則新線程將取代它的位置。池中的線程將一直存在,直到它被明確關閉。 – pvg

+1

這不是可怕的代碼,這是一個_learning test_。如圖所示,它只是一個手動測試,但您可以將其自動化,並將其作爲某個應用程序的單元測試套件的一部分,以便記錄應用程序依賴於該行爲。 –

回答

3

您的執行者服務使用線程池。如果一個線程被殺死,另一個將被實例化以執行下一個任務。

您的電話Executors.newFixedThreadPool(1);僅設置活動線程數的限制。

爲了停止執行的服務,你必須調用:

executorService.shutdown(); 
+0

或'executorService.shutDownNow()'。 – OldCurmudgeon

相關問題