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())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,319评论 4 56
  • 文章摘要:在业务系统中,线程池框架技术一直是用来解决多线程并发的一种有效方法。 在JDK中,J.U.C并发包下的T...
    癫狂侠阅读 2,127评论 2 21
  • 引言 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况...
    Java耕耘者阅读 824评论 0 0
  • 什么是死锁?如何避免 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外...
    广告被屏蔽阅读 344评论 0 0
  • 目录:一、Java 基础二、容器三、多线程四、反射五、对象拷贝六、异常七、设计模式八、网络编程 欢迎评论留言,文章...
    mumuxi_阅读 782评论 0 13