<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #### 線程異常處理 * 在run方法上增加異常處理 ``` new Thread(() -> { try { System.err.println(3 / 2); System.err.println(3 / 0); } catch (Exception e) { System.err.println("Catch exception===>" + e.getMessage()); } }).start(); ``` * 使用UncaughtExceptionHandler處理未捕獲異常 ``` Thread thread = new Thread(() -> { System.err.println(3 / 2); System.err.println(3 / 0); }); thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.err.println(Thread.currentThread().getName() + "==>" + e.getMessage()); } }); thread.start(); ``` 可以為所有的Thread設置一個默認的UncaughtExceptionHandler,通過調用Thread.setDefaultUncaughtExceptionHandler\(Thread.UncaughtExceptionHandler eh\)方法 ``` public static void main(String[] args) throws InterruptedException { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.err.println("全局線程默認異常處理:" + t.getName() + "\n" + e.getMessage()); } }); new Thread(() -> { System.err.println(3 / 0); }).start(); new Thread(() -> { System.err.println(args[4]); }).start(); } ``` #### 線程池異常處理 ExecutorService-&gt;execute方法線程處理 ``` public class ExecuteCaught { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); Thread thread = new Thread(new Task()); thread.setUncaughtExceptionHandler(new ExceptionHandler()); exec.execute(thread); exec.shutdown(); } } output=====> 1 Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero at com.exception.Task.run(NoCaughtThread.java:25) at java.lang.Thread.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) ``` 該方式并未捕獲異常,正確的處理方法 ``` public class ExecuteCaught { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new ThreadPoolTask()); exec.shutdown(); } } class ThreadPoolTask implements Runnable { @Override public void run() { Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler()); System.out.println(3/2); System.out.println(3/0); System.out.println(3/1); } } ``` _注意_ 只有通過execute提交的任務,才能將它拋出的異常交給UncaughtExceptionHandler,而通過submit提交的任務,無論是拋出的未檢測異常還是已檢查異常,都將被認為是任務返回狀態的一部分。如果一個由submit提交的任務由于拋出了異常而結束,那么這個異常將被Future.get封裝在ExecutionException中重新拋出 ``` public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); exec.submit(() -> { System.err.println(3 / 0); }); exec.shutdown(); } ### 未捕獲異常 ``` 正確方式: ``` public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); Future<?> future = exec.submit(() -> { System.err.println(3 / 0); }); try { Object o = future.get(); } catch (ExecutionException e) { System.err.println("捕獲異常:" + e.getMessage()); } exec.shutdown(); } ``` 【知識點】 1. 如果設置了實例屬性uncaughtExceptionHandler(每個線程對象獨有),則調用該處理器對未捕獲異常進行處理; 2. 如果沒有設置未捕獲異常處理器(即1中的uncaughtExceptionHandler),則將線程對象的ThreadGroup當作未捕獲異常處理器,在ThreadGroup中獲取所以線程對象共享的靜態屬性defaultUncaughtExceptionHandler來處理未捕獲異常(前提是靜態的set方法你調用了并且傳入處理器實例\); 3. 如果兩個set方法都沒有調用,那么異常棧信息將被推送到System.err進行處理; 【參考資料】 https://blog.csdn.net/reliveIT/article/details/51167545
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看