我在sleep()时中断了方法并且没有出现异常

这里说当另一个线程在睡眠处于活动状态时中断该线程时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是一个静态方法,所以t2.sleep(1_000)实际上是有效的Thread.sleep(1_000),所以你只是让当前线程 sleep。

(你能想象如果你被允许让其他线程任意休眠会造成什么样的混乱吗......?)


其次,您实际上并没有检查Test2. 因此,当您确实中断它时,没有任何东西在侦听中断,因此什么也不会发生。

如果你想检查中断,你可以做类似的事情

 while (!interrupted()) {}

但即使这样也不会抛出InterruptedException: 循环将停止执行。


第三,Test2确实InterruptedException在其run()方法中抛出了一个,它必须在该方法中进行处理。InterruptedException是一个受检异常,所以你不能添加throws InterruptedException到它的签名中,因为run()它没有声明它抛出任何受检异常。因此,它永远不会“逃避”该方法。


第四,即使您确实设法InterruptedException逃脱了该Thread.run()方法(有一些狡猾和卑鄙的方法可以做到这一点),但这并不意味着它可以在主线程内被捕获。异常将由未捕获的异常处理程序处理,主线程将继续执行。


以上是我在sleep()时中断了方法并且没有出现异常的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>