[英]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
實例submit
給Executor
時,重復同樣的錯誤。 執行器將執行Thread
實例的run
方法,因為Thread
實現Runnable
但是Executor
將在其自己的托管Thread
Executor
操作,而不是在您已創建但從未啟動的實例代表的Thread
。
再次重申,在從未啟動的Thread
實例上調用interrupt
不會中斷實際執行代碼的線程。
通常,您不應混用 Thread
和Executor
用法。 確定一種方式,手動處理Thread
或使用ExecutorSevice
。
而且,當您使用Thread
,必須使用start()
方法啟動它們,而不是調用run()
方法。
線程僅在可中斷操作期間被中斷,例如Thread.sleep(),
Thread.wait(),
和某些I / O調用(並非全部)。
設置中斷標志不會中斷線程。 線程只是在檢查時結束(如果應該結束)。 因此,只需給Thread一個機會檢查isInterrupted() ,或在其休眠或等待時中斷它即可。 如果您在run()中有一個長期方法,則interrupt()將不起作用。 您必須實施定期檢查或其他解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.