簡體   English   中英

我在 sleep() 時中斷了方法並且沒有異常

[英]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.

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