获取 InterruptedException 以忽略中断

Getting InterruptedException to ignore the interrupt

我是多线程的新手(一般情况下和 Java 中),只是想尝试处理中断异常的一些基本方面。

当我 运行 下面的代码时,我得到以下输出 -

1:再见,世界! 1:你好,世界! 2:再见,世界! 3:再见,世界! 4:再见,世界! 5:再见,世界!

但我不明白为什么线程 1("Hello, World!")线程正在停止,因为它的 Catch 子句是空的(我认为这意味着它会忽略 InterruptedException 并完成线程)。

我确信我遗漏了一些基本的东西,但我不知道它是什么。

感谢您提供的任何帮助!


public class GreetingProducer implements Runnable
{
    String greeting;

    public GreetingProducer (String greetingIn)
    {
        greeting = greetingIn;
    }
    public void run()
    {
        try
        {
            for (int i = 1; i <=5; i++)
            {
                System.out.println(i + ": " + greeting);
                Thread.sleep(500);
            }
        }
        catch (InterruptedException e)
        {

        }
    }

    public static void main(String[] args)
    {
        Runnable r1 = new GreetingProducer("Hello, World!");
        Runnable r2 = new GreetingProducer("Goodbye, World!");
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);
        t1.start();
        t2.start();
        t1.interrupt();
    }
}

catch 子句可能为空,但 InterruptedException 正在被捕获并执行 catch 块。

因为异常被吞没,所以没有执行任何操作,但是随后代码像任何其他异常一样退出 try - catch 块。

如果您在 catch 块中有指令,它将被执行。


想要不被打扰的睡眠,可以使用Guava的sleepUninterruptibly方法:

for (int i = 1 ; i <= 5 ; i++) {
    System.out.println(i + ": " + greeting);
    Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
}

那么 try - catch 块就变得不必要了。