我是这么说的 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) {}
}
}
1条答案
按热度按时间i7uq4tfw1#
(至少)四个问题:
首先,你不是真的
t2
睡觉。Thread.sleep
是静态方法,所以t2.sleep(1_000)
实际上是有效的Thread.sleep(1_000)
,所以你只是让当前线程休眠。(你能想象如果你被允许让其他线程任意休眠会造成什么样的混乱吗…?)
第二,你实际上并没有检查
Test2
. 所以,当你打断它的时候,什么也听不到,所以什么也不会发生。如果你想检查是否有中断,你可以这样做
但即使这样也不会让人失望
InterruptedException
:循环将停止执行。第三,
Test2
你扔了一个InterruptedException
在它的run()
方法,则必须在该方法中处理。InterruptedException
是选中的异常,因此无法添加throws InterruptedException
因为run()
不会声明它抛出任何选中的异常。因此,它永远不会“逃脱”这个方法。第四,即使你成功地
InterruptedException
为了逃避Thread.run()
方法(有一些狡猾和卑鄙的方法可以做到这一点),这并不意味着它可以在主线程中被捕获。异常将由未捕获的异常处理程序处理,并且主线程将继续运行。