
回复
向线程池提交任务的两个方法 execute()、submit() 的区别,我总结的主要有四点
(1)申明位置不同:execute() 方法定义在 Executor 接口中,submit() 方法定义在 ExecutorService 接口中;ExecutorService 接口继承了 Executor 接口。
(2)可传参数不同: execute() 方法参数只能传入 Runnable 接口;submit() 方法有三个重载的方法;
(3) 有无返回值不同:execute() 方法没有返回值是 void;submit() 方法用于提交需要返回值的任务。线程池会返回一个 future 类型的对象,通过这个 future对象可以判断任务是否执行成功,并且可以通过future的 get() 方法来获取返回值,get() 方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务都还没有执行完就返回的,时间一到就会返回当前的结果。
(4) 如果我们希望调用者能够知道内部有 Exception 并做处理,那么就需要实现 Callable 接口,并且通过对Future.get() 进行抛出异常的捕获,然后对其进行处理。
演示第(4)点的代码:
执行打印结果:
其实只要你代码中有对返回值明确的处理异常, execute() 、submit() 方法提交的任务都是会显示报与之对应的错误的。
作者:一个长不胖的程序YUAN
来源:CSDN