原文网址:Java线程池--全局异常处理的方法(有实例)_IT利刃出鞘的博客-CSDN博客
简介
说明
本文用示例介绍如何全局捕获Java线程池中的异常。
本文内容概述
本文先用示例介绍不捕获异常时的现象(即:“实例:不捕获异常”),再针对线程池的任务提交的三种方式分别说明异常处理的方法。线程池的任务提交的三种方式如下:
- Thread
- Runnable + execute
- Callable + submit
实例:不捕获异常
说明
当抛出RuntimeException异常时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。
实例
package com.example.a;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + ":运行开始");
int i = 1 / 0;
System.out.println(name + ":运行结束");
}
}
public class Demo {
public static void main(String[] args) {
System.out.println("主线程开始");
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new MyThread("线程1"));
executor.shutdown();
System.out.println("主线程结束");
}
}
执行结果
主线程开始
主线程结束
线程1:运行开始
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
at com.example.a.MyThread.run(Demo.java:16)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
方案1:Thread
法1:自定义ThreadPoolExecutor
自定义ThreadPoolExecutor, 重写afterExecute方法
上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-线程池全局异常处理的方法(有实例) - 自学精灵