Java线程<第四篇>:Hook线程以及捕获线程执行异常

一、捕获线程执行异常

Java为我们提供了一个 UncaughtExceptionHandler 接口,当线程在运行过程中出现异常时,会回调 UncaughtExceptionHandler 接口,从而得知是哪个线程在运行时出错,以及出现了什么样的错误。

    // 设置回调接口
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
        }
    });

当进程被启动的时候,执行Thread的 setDefaultUncaughtExceptionHandler 方法来监听进程内的异常。

当然,如果已经被 try { } catch (Exception e) { } 捕获的异常将不会被 uncaughtExceptionHandler 重复捕获。

二、Hook线程(注入钩子线程)

JVM进程的退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注入一个Hook线程,在JVM进程退出的时候,Hook线程会启动执行,通过 Runtime 可以为 JVM 注入多个 Hook 线程。

    // 注入一个 Hook 线程
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {
            
        }
    }));

当程序退出时,会执行到该 Hook 线程。

Hook 线程可以注入多个,当程序主动退出或异常退出时,可以利用 Hook 线程做一些释放资源的操作。

Hook 线程不要处理耗时操作,否则会延长程序退出的时间。

[本章完...]

你可能感兴趣的:(Java线程<第四篇>:Hook线程以及捕获线程执行异常)