Java 当方法sleep()和don';我没有例外

Java 当方法sleep()和don';我没有例外,java,multithreading,Java,Multithreading,表示当另一个线程在睡眠处于活动状态时中断此线程时,sleep()抛出InterruptedException。那么,为什么我在那里有一个无限循环,但不InterruptedException public class Test { public static void main(String[] args) throws InterruptedException { Test2 t2 = new Test2(); t2.start();

表示当另一个线程在睡眠处于活动状态时中断此线程时,
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) {}
    }
}
(至少)四个问题:


首先,你实际上并没有在睡觉
Thread.sleep
是一种静态方法,因此
t2.sleep(1000)
实际上是
Thread.sleep(1000)
,所以您只是在做一些简单的操作

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


其次,您实际上没有在
Test2
中检查中断。所以,当你打断它的时候,没有人在听打断,所以什么也不会发生

如果您想检查是否有中断,可以执行以下操作

 while (!interrupted()) {}
但即使这样也不会抛出
中断异常
:循环将停止执行


第三,
Test2
确实在其
run()
方法中抛出了一个
InterruptedException
,它必须在该方法中处理
InterruptedException
是一个选中的异常,因此不能将
抛出InterruptedException
添加到其签名中,因为
run()
不会声明它抛出任何选中的异常。因此,它永远不会“逃脱”这种方法


第四,即使您确实设法让
InterruptedException
跳出
Thread.run()
方法(有很多不正当和卑鄙的方法),但这并不意味着它可以在主线程中被捕获。异常将由未捕获的异常处理程序处理,主线程将继续运行。至少有四个问题:


首先,你实际上并没有在睡觉
Thread.sleep
是一种静态方法,因此
t2.sleep(1000)
实际上是
Thread.sleep(1000)
,所以您只是在做一些简单的操作

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


其次,您实际上没有在
Test2
中检查中断。所以,当你打断它的时候,没有人在听打断,所以什么也不会发生

如果您想检查是否有中断,可以执行以下操作

 while (!interrupted()) {}
但即使这样也不会抛出
中断异常
:循环将停止执行


第三,
Test2
确实在其
run()
方法中抛出了一个
InterruptedException
,它必须在该方法中处理
InterruptedException
是一个选中的异常,因此不能将
抛出InterruptedException
添加到其签名中,因为
run()
不会声明它抛出任何选中的异常。因此,它永远不会“逃脱”这种方法



第四,即使您确实设法让
InterruptedException
跳出
Thread.run()
方法(有很多不正当和卑鄙的方法),但这并不意味着它可以在主线程中被捕获。异常将由未捕获的异常处理程序处理,主线程将继续运行,但不会更明智。

我不希望循环中断,我想在
t2
线程中引起
InterruptedException
,但我不知道t2.sleep()=thread.sleep()@Denis_newbie,即使你不希望循环中断,你必须检查是否有中断才能知道你是否被中断。我不想循环中断我想在
t2
线程中引起
InterruptedException
,但我不知道t2.sleep()=thread.sleep()@Denis_newbie,即使你不想循环中断,你必须检查是否有人打扰你,才能知道你是否被打扰了。