標籤:exec -- current cep mil pool 執行 class .exe
1.1. 任務結果的異常處理
如果任務執行過程中發生異常,則get()方法會產生ExecutionException。
ExecutorService executorService = Executors.newFixedThreadPool(2);Future<Integer> future = executorService.submit( new Callable(){ @Overridepublic Integer call() throws Exception {throw new RuntimeException("some exception.");//return 1;} }); try {int ret = future.get();System.out.println("return:" + ret);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}
java.util.concurrent.ExecutionException: java.lang.RuntimeException: some exception.
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.test.concurrence.ThreadPoolTest.testFutureThreadPool(ThreadPoolTest.java:34)
at com.test.concurrence.ThreadPoolTest.main(ThreadPoolTest.java:16)
Caused by: java.lang.RuntimeException: some exception.
at com.test.concurrence.ThreadPoolTest$1.call(ThreadPoolTest.java:26)
at com.test.concurrence.ThreadPoolTest$1.call(ThreadPoolTest.java:1)
at java.util.concurrent.FutureTask.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)
如果任務執行過程中,線程被打斷,則get()方法產生InterruptedException。
已知任務執行過程中sleep()/wait()時,如果shutdownNow()方法執行了,get會捕捉到sleep()產生的InterruptException,但是是通過ExecutionException的方式產生,而不是InterruptedException的方式。
ExecutorService executorService = Executors.newFixedThreadPool(2);Future<Integer> future = executorService.submit( new Callable(){ @Overridepublic Integer call() throws Exception {Thread.sleep(1000*10);System.out.println("------after sleep----------");return 1;} }); executorService.shutdownNow(); try {int ret = future.get();System.out.println("return:" + ret);} catch (InterruptedException e) {System.out.println("---------interrupted exception--------");e.printStackTrace();} catch (ExecutionException e) {System.out.println("---------execution exception--------");e.printStackTrace();} catch(CancellationException e){System.out.println("---------cancellation exception--------");e.printStackTrace(); }
---------execution exception--------
java.util.concurrent.ExecutionException: java.lang.InterruptedException: sleep interrupted
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.test.concurrence.ThreadPoolTest.testFutureThreadPool(ThreadPoolTest.java:39)
at com.test.concurrence.ThreadPoolTest.main(ThreadPoolTest.java:17)
Caused by: java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.test.concurrence.ThreadPoolTest$1.call(ThreadPoolTest.java:27)
at com.test.concurrence.ThreadPoolTest$1.call(ThreadPoolTest.java:1)
at java.util.concurrent.FutureTask.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)
如果調用get()方法的線程被打斷,則會導致get()方法產生InterruptedException。
ExecutorService executorService = Executors.newFixedThreadPool(2);final Thread mainThread = Thread.currentThread();Future<Integer> future = executorService.submit( new Callable(){ @Overridepublic Integer call() throws Exception {Thread.sleep(1000*3);mainThread.interrupt();return 1;} }); try {int ret = future.get();System.out.println("return:" + ret);} catch (InterruptedException e) {System.out.println("---------interrupted exception--------");e.printStackTrace();} catch (ExecutionException e) {System.out.println("---------execution exception--------");e.printStackTrace();} catch(CancellationException e){System.out.println("---------cancellation exception--------");e.printStackTrace(); }
---------interrupted exception--------
java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.test.concurrence.ThreadPoolTest.testFutureThreadPool(ThreadPoolTest.java:38)
at com.test.concurrence.ThreadPoolTest.main(ThreadPoolTest.java:17)
Java並發程式設計(10)線程池之任務結果的異常處理