龙空技术网

多线程的异常处理

爱学习的小菜鸟 248

前言:

而今同学们对“多线程发生异常”可能比较讲究,姐妹们都想要了解一些“多线程发生异常”的相关知识。那么小编在网摘上搜集了一些关于“多线程发生异常””的相关内容,希望小伙伴们能喜欢,同学们一起来了解一下吧!

多线程的异常处理

在线程中如果出现异常想要额外进行一些操作的话,可以使用线程的异常处理机制,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();    }}

例子不是一个好例子,但是主要就是展示一下如何使用,场景自己把握

标签: #多线程发生异常 #多线程常见异常