簡體   English   中英

線程interrupt()不中斷線程

[英]Thread interrupt() does not interrupt thread

出於某種原因,當遍歷線程列表並中斷所有線程時,它們都不使用InterruptedException執行catch塊。

在以下存儲庫中: https : //github.com/ranisalt/LiuThread

我有兩個線程,每個線程都有執行器服務,其中一個線程擁有讀者,另一個線程則是作家。 編寫器應每100毫秒產生一次,寫入緩沖區,然后退出/停止/無論什么都不要再次寫入。 讀者有4個嘗試閱讀的線程,如果可以的話,他們也應該退出,所以還有其他讀者的空間。

我每個人都有100個(讀取器和寫入器),如果它們無法讀取或寫入,它們將等待60秒。

然后,我有一個協調器線程,不斷測試緩沖區是否為空(並中斷編寫器)或已滿(中斷讀取器),因此它們永遠不必等待60秒。 緩沖區知道其狀態。

由於某些原因,問題在於此代碼段:

for (ThreadAzul azul : threadsAzuis) {
    azul.interrupt();
}

沒有中斷線程! 我已經使用println查看是否被打斷了:

try {
    sleep(60000);
    System.out.println(this.getName() + " foi dormir");
} catch (InterruptedException e) {
    System.out.println(this.getName() + " foi interrompido");
}

但這從來沒有寫過。 中斷()無法使catch塊執行的原因是什么?

main方法內部,您是在Thread上調用run() ,因此您無需啟動新Thread ,而是在初始main線程中運行其代碼。 因此,在您從未啟動的Thread實例上調用interrupt將不會中斷實際上正在執行代碼的main線程。

當您submit Thread實例submitExecutor時,重復同樣的錯誤。 執行器將執行Thread實例的run方法,因為Thread實現Runnable但是Executor將在其自己的托管Thread Executor操作,而不是在您已創建但從未啟動的實例代表的Thread

再次重申,在從未啟動的Thread實例上調用interrupt不會中斷實際執行代碼的線程。

通常,您不應混用 ThreadExecutor用法。 確定一種方式,手動處理Thread或使用ExecutorSevice

而且,當您使用Thread ,必須使用start()方法啟動它們,而不是調用run()方法。

線程僅在可中斷操作期間被中斷,例如Thread.sleep(), Thread.wait(),和某些I / O調用(並非全部)。

設置中斷標志不會中斷線程。 線程只是在檢查時結束(如果應該結束)。 因此,只需給Thread一個機會檢查isInterrupted() ,或在其休眠或等待時中斷它即可。 如果您在run()中有一個長期方法,則interrupt()將不起作用。 您必須實施定期檢查或其他解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM