[英]I interrupted method when it sleep() and don't get an exception
這里說當另一個線程在睡眠處於活動狀態時中斷該線程時, sleep()
會拋出InterruptedException
。 那么為什么我在那里有一個無限循環但沒有InterruptedException
呢?
public class Test
{
public static void main(String[] args) throws InterruptedException
{
Test2 t2 = new Test2();
t2.start();
t2.sleep(1_000);
t2.interrupt();
}
}
class Test2 extends Thread
{
@Override
public void run()
{
while (true) {}
}
}
(至少)四個問題:
首先,你實際上並沒有讓t2
睡眠。 Thread.sleep
是一個 static 方法,所以t2.sleep(1_000)
實際上是有效的Thread.sleep(1_000)
,所以你只是讓當前線程 sleep 。
(你能想象如果你被允許讓其他線程任意休眠可能造成的混亂......?)
其次,您實際上並沒有檢查Test2
中的中斷。 所以,當你打斷它時,沒有任何東西在監聽中斷,所以什么都不會發生。
如果你想檢查中斷,你可以做類似的事情
while (!interrupted()) {}
但即使這樣也不會拋出InterruptedException
:循環將停止執行。
第三, Test2
確實在其run()
方法中拋出了一個InterruptedException
,它必須在該方法中處理。 InterruptedException
是一個檢查異常,因此您不能將throws InterruptedException
添加到它的簽名中,因為run()
沒有聲明它拋出任何檢查異常。 因此,它永遠不會“逃避”該方法。
第四,即使您確實設法讓InterruptedException
逃脫Thread.run()
方法(有一些狡猾和卑鄙的方法可以做到這一點),但這並不意味着它可以在主線程中被捕獲。 異常將由未捕獲的異常處理程序處理,主線程將繼續運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.