Java線程池吞異常源碼解析

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章