java - 获取 InterruptedException 以忽略中断

标签 java multithreading interrupted-exception

我是多线程(一般的和 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 block 。

由于异常被吞噬,因此不会执行任何操作,但随后代码会像处理任何其他异常一样退出 try - catch block 。

如果 catch block 中有指令,它将被执行。

<小时/>

如果你想不受打扰地 sleep ,可以使用Guava的sleepUninterruptibly方法:

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

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

关于java - 获取 InterruptedException 以忽略中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266575/

相关文章:

java - 如何在 JButton ActionListener 中调用需要 InterruptedException 的方法

java - 如何根据具体需求创建接口(interface)

java - 将 DropDown 列表的值传递给 if 语句

c - 等待用户空间中可能完成?

c - c语言pthread第三个参数

java - 线程中断标志语义

java - 仅检索维基百科中的介绍文本

java - 有人可以帮我弄清楚为什么我无法调用我的方法吗?

python - python中的线程使用队列

java - 调用 thread.isInterrupted 并打印结果时的不同行为