工作中使用線程池,內部發生了異常,由於是在線上,進行了日誌打印,怎麼都打印不出來,賊坑。。。
然後本地模擬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();
}
}
});
}