原创转载请注明出处:http://agilestyle.iteye.com/blog/2343704
execute()
execute()没有返回值,在默认的情况下异常直接抛出,不能捕获,但可以通过自定义ThreadFactory的方式进行捕获
submit()
submit()有返回值,在默认的情况下,可以catch ExecutionException捕获异常
execute无返回值,submit有返回值
FutureCallableTest7.java
package org.fool.java.concurrent.futurecallable; import java.util.concurrent.*; public class FutureCallableTest7 { public static void main(String[] args) { try { ExecutorService executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); executor.execute(new Runnable() { @Override public void run() { System.out.println("execute() invoked..., no return value..."); } }); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { System.out.println("submit() invoked..., has return value..."); return "data"; } }); System.out.println(future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
Run
execute出现异常后直接打印堆栈信息
FutureCallableTest8.java
package org.fool.java.concurrent.futurecallable; import java.util.concurrent.*; public class FutureCallableTest8 { public static void main(String[] args) { ExecutorService executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); executor.execute(new Runnable() { @Override public void run() { Integer.parseInt("a"); } }); } }
Run
submit()可以捕获异常
FutureCallableTest9.java
package org.fool.java.concurrent.futurecallable; import java.util.concurrent.*; public class FutureCallableTest9 { public static void main(String[] args) { try { ExecutorService executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { Integer.parseInt("a"); return "data exception"; } }); System.out.println(future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { System.out.println("ExecutionException catched..."); e.printStackTrace(); } } }
Run
execute()自定义ThreadFactory的方式进行捕获异常
FutureCallableTest10.java
package org.fool.java.concurrent.futurecallable; import java.util.concurrent.*; public class FutureCallableTest10 { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>()); executor.setThreadFactory(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("Custom Exception in execute()"); e.printStackTrace(); } }); return t; } }); executor.execute(new Runnable() { @Override public void run() { Integer.parseInt("a"); } }); } }
Run