工作中使用线程池,内部发生了异常,由于是在线上,进行了日志打印,怎么都打印不出来,贼坑。。。
然后本地模拟debug终于找到了原因,使用线程池submit方法执行线程时候会吞掉异常,导致异常无法打印出来
测试代码:
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(1);
pool.submit(new Runnable() {
@Override
public void run() {
String str = "{dsd";
System.out.println(JSON.parse(str));
}
});
}
源码分析:
调用过程中产生异常后,会把异常set到ftask中去,所以通过调用ftask.get()时候会报异常
解决方案:
1.
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(1);
Future<?> ftask = pool.submit(new Runnable() {
@Override
public void run() {
String str = "{dsd";
System.out.println(JSON.parse(str));
}
});
try {
ftask.get()
} catch (Exception e) {
// todo 打印异常
}
}
2.
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(1);
Future<?> submit = pool.submit(new Runnable() {
@Override
public void run() {
try{
String str = "{dsd";
System.out.println(JSON.parse(str));
}catch (Exception e){
e.printStackTrace();
}
}
});
}