java—我在方法sleep()时中断了它,并且没有得到异常

ezykj2lf  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(367)

我是这么说的 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) {}
    }
}
i7uq4tfw

i7uq4tfw1#

(至少)四个问题:
首先,你不是真的 t2 睡觉。 Thread.sleep 是静态方法,所以 t2.sleep(1_000) 实际上是有效的 Thread.sleep(1_000) ,所以你只是让当前线程休眠。
(你能想象如果你被允许让其他线程任意休眠会造成什么样的混乱吗…?)
第二,你实际上并没有检查 Test2 . 所以,当你打断它的时候,什么也听不到,所以什么也不会发生。
如果你想检查是否有中断,你可以这样做

while (!interrupted()) {}

但即使这样也不会让人失望 InterruptedException :循环将停止执行。
第三, Test2 你扔了一个 InterruptedException 在它的 run() 方法,则必须在该方法中处理。 InterruptedException 是选中的异常,因此无法添加 throws InterruptedException 因为 run() 不会声明它抛出任何选中的异常。因此,它永远不会“逃脱”这个方法。
第四,即使你成功地 InterruptedException 为了逃避 Thread.run() 方法(有一些狡猾和卑鄙的方法可以做到这一点),这并不意味着它可以在主线程中被捕获。异常将由未捕获的异常处理程序处理,并且主线程将继续运行。

相关问题