1.多线程任务一般就只有两种excute和sumbit, 最大的区别就是execute没有返回值,submit有返回值。
异常捕获方法如下
TassThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
4,// 核心线程数量
20,// 最大线程数
30,// 空闲线程最大存活时间
TimeUnit.SECONDS,// 时间单位 秒
new ArrayBlockingQueue<>(30),
Executors.privilegedThreadFactory(),// 创建线程工厂
new ThreadPoolExecutor.AbortPolicy()// 任务的拒绝策略
) {
//重写afterExecute方法
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
//excute提交
if (t != null) {
log.error("afterExecute执行异常" + t);
}
//如果r的实际类型是FutureTask 那么是submit提交的,所以可以在里面get到异常
if (r instanceof FutureTask) {
try {
Future<?> future = (Future<?>) r;
future.get();
} catch (Exception e) {
log.error("future执行异常", e);
}
}
}
};