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