获取InterruptedException以忽略中断

时间:2015-02-01 19:04:42

标签: 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();
    }
}

1 个答案:

答案 0 :(得分:3)

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块变得不必要了。