为什么在这个多线程示例中没有捕获异常?

w8rqjzmb  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(324)

我试图学习异常如何在多线程中传播。
问题
在下面的示例中。为什么 RuntimeException 未捕获异常 System.out.println("Exception handled " + e); // Why not print this line ?
给定代码

package p05_Interrupt;

public class D05_Interrupt1 extends Thread {
  public void run()  {
    try {
      Thread.sleep(1000);
      System.out.println("task");
    } catch (InterruptedException e) {
      throw new RuntimeException("Thread interrupted..." + e);
    }

  }

  public static void main(String args[]) {
    D05_Interrupt1 t1 = new D05_Interrupt1();
    t1.start();
    try {
      t1.interrupt();
    } catch (Exception e) {
      System.out.println("Exception handled " + e); // Why not print this line 
    }

  }
}

javatpoint中的第一个示例“中断停止工作的线程的示例”
输出

Exception in thread "Thread-0" java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted
    at p05_Interrupt.D05_Interrupt1.run(D05_Interrupt1.java:9)

是因为这是多线程的,所以在线程中打印异常吗 t1 ,以及 main() 线程被隐藏?
我还试着在 public void run() throws RuntimeException { 什么都没变。

qvsjd97n

qvsjd97n1#

您无法在主线程中捕获线程抛出的异常(就像那样)。但是,您可以实现thread.uncaughtexceptionhandler来实现这一点。
公共静态接口thread.uncaughtexceptionhandler接口,用于在线程由于未捕获的异常而突然终止时调用的处理程序。
当线程由于未捕获的异常即将终止时,java虚拟机将使用thread.getuncaughtexceptionhandler()查询该线程的未捕获异常处理程序,并调用处理程序的uncaughtexception方法,将线程和异常作为参数传递。如果线程没有显式设置uncaughtexceptionhandler,则其threadgroup对象将充当uncaughtexceptionhandler。如果threadgroup对象对处理异常没有特殊要求,它可以将调用转发给默认的未捕获异常处理程序。

public class D05_Interrupt1 extends Thread 
        implements Thread.UncaughtExceptionHandler {

    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("task");
        } catch (InterruptedException e) {
            throw new RuntimeException("Thread interrupted..." + e);
        }
    }

    public static void main(String args[]) {
        D05_Interrupt1 t1 = new D05_Interrupt1();
        Thread.setDefaultUncaughtExceptionHandler(t1);
        t1.start();
        t1.interrupt();
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Exception handled " + e); // Why not print this line
    }
}

输出:

Exception handled java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted

相关问题