前言:
而今同学们对“多线程发生异常”可能比较讲究,姐妹们都想要了解一些“多线程发生异常”的相关知识。那么小编在网摘上搜集了一些关于“多线程发生异常””的相关内容,希望小伙伴们能喜欢,同学们一起来了解一下吧!多线程的异常处理
在线程中如果出现异常想要额外进行一些操作的话,可以使用线程的异常处理机制,UncaughtExceptionHandler,这是线程的一个子接口,当一个未捕获的异常导致线程中断的时候JVM会使用thread.getUncaughtExceptionHandler()来查询线程的uncaughtExceptionHandler并将线程和异常作为参数传递给uncaughtException方法
@FunctionalInterfacepublic interface UncaughtExceptionHandler { /** * Method invoked when the given thread terminates due to the * given uncaught exception. * <p>Any exception thrown by this method will be ignored by the * Java Virtual Machine. * @param t the thread * @param e the exception */ void uncaughtException(Thread t, Throwable e);}
如果当前线程没有显示的调用thread.setUncaughtExceptionHandler()方法设置处理器时,会默认使用该线程的线程组的uncaughtException()方法,线程组是实现了UncaughtExceptionHandler接口的,线程组是在线程实例化时就进行指定的
public class ThreadGroup implements Thread.UncaughtExceptionHandler自定义Handler
如何自定义handler并进行使用呢,那当然是要实现UncaughtExceptionHandler接口了,重写uncaughtException()方法即可
class MyExceptionHandler implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName()+"抛出异常"+e.getMessage()); e.printStackTrace(); }}
在实例化线程的时候进行指定handler即可
thread.setUncaughtExceptionHandler(new MyExceptionHandler());
代码示例
public class TestExceptionHandler { public static void main(String[] args) { TestExceptionHandler test = new TestExceptionHandler(); Thread thread = new Thread(test.new MyThread()); thread.setUncaughtExceptionHandler(new MyExceptionHandler()); thread.start(); } class MyThread implements Runnable{ @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } int i = 1/0; } }}class MyExceptionHandler implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName()+"抛出异常"+e.getMessage()); e.printStackTrace(); }}
例子不是一个好例子,但是主要就是展示一下如何使用,场景自己把握