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