我在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()方法(有一些狡猾和卑鄙的方法可以做到这一点),但这并不意味着它可以在主线程内被捕获。异常将由未捕获的异常处理程序处理,主线程将继续执行。