ExecutorService之submit与execute

ExecutorService的submit与execute方法都能执行任务,但在使用过程,发现其对待run方法抛出的异常处理方式不一样。
两者执行任务最后都会通过Executor的execute方法来执行,但对于submit,会将runnable物件包装成FutureTask,其run方法会捕捉被包装的Runnable Object的run方法抛出的Throwable异常,待submit方法所返回的的Future Object调用get方法时,将执行任务时捕获的Throwable Object包装成java.util.concurrent.ExecutionException来抛出。

而对于execute方法,则会直接抛出异常,该异常不能被捕获,想要在出现异常时做些处理,可以实现Thread.UncaughtExceptionHandler接口:

class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
 public void uncaughtException(Thread t, Throwable e) {
 System.out.println(\"caught \"+e);
 }
}

class HandlerThreadFactory implements ThreadFactory{
 public Thread newThread(Runnable r) {
 Thread t=new Thread(r);
 t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
 return t;
 }
}

ExecutorService exec=Executors.newCachedThreadPool(new HandlerThreadFactory())

你可能感兴趣的:(ExecutorService之submit与execute)