除了execute方法之外,ThreadPoolExecutor 还有其他三个单提交的方法,它们的内部都是调用的execute方法。
1. Future submit(Runnable)
public Future< ? > submit(Runnable task)
task要求一个 Runnable 实现类,返回一个 Future 对象。这个 Future 对象可以用来检查 Runnable 是否已经执行完毕。该 Future 的 get 方法在任务成功完成时将会返回 null。
如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。
/**
* 位于父类AbstractExecutorService中的实现
*
* @throws RejectedExecutionException 如果任务无法安排执行
* @throws NullPointerException 如果该任务为 null
*/
public Future> submit(Runnable task) {
//首先就是task任务的null校验,如果为null直接抛出NullPointerException
if (task == null) throw new NullPointerException();
//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,返回null
RunnableFuture ftask = newTaskFor(task, null);
//调用execute方法传递ftask,RunnableFuture是Runnable的子接口,因此可以传递
execute(ftask);
return ftask;
}
/**
* 位于父类AbstractExecutorService中的实现
* 为给定可运行任务返回一个 RunnableFuture。
* 该RunnableFuture具有默认的返回值,并为底层任务提供取消操作。
*
* @param runnable 被包装的任务
* @param value 将要返回的默认值
* @param 返回值类型
* @return 为给定可运行任务返回一个 RunnableFuture。
*/
protected RunnableFuture newTaskFor(Runnable runnable, T value) {
//调用FutureTask的构造器
return new FutureTask(runnable, value);
}
后面我们再介绍FutureTask是如何对Runnable以及Callable任务进行包装的,以及FutureTask相关方法的实现。
2. Future submit(Runnable, T)
public < T > Future< T > submit(Runnable task,T result)
task要求一个 Runnable 实现类,并且需要一个给定的返回值result,将返回一个 Future 对象,这个 Future 对象除了可以用来检查 Runnable 是否已经执行完毕,还可以调用get()方法获取执行结果,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。
/**
* 位于父类AbstractExecutorService中的实现
* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture具有指定默认的返回值result,并为底层任务提供取消等操作。
* 同时调用execute执行这个RunnableFuture实例。
*
* @throws RejectedExecutionException 如果任务无法安排执行
* @throws NullPointerException 如果该任务为 null
*/
public Future submit(Runnable task, T result) {
//首先就是task任务的null校验,如果为null直接抛出NullPointerException
if (task == null) throw new NullPointerException();
//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,get返回指定值
RunnableFuture ftask = newTaskFor(task, result);
//调用execute方法传递ftask,RunnableFuture是Runnable的子接口,因此可以传递
execute(ftask);
return ftask;
}
3. Future submit(Callable< T >)
public < T > Future< T > submit(Callable< T > task)
task要求一个 Callable实现类。返回一个 Future 对象,这个 Future 对象除了可以用来检查 Runnable 是否已经执行完毕,还可以调用get()方法获取Callable中call方法的执行结果,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。
/**
* 位于父类AbstractExecutorService中的实现
* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture的返回值result就是传递的Callable的call方法的返回值,并为底层任务提供取消等操作。
* 同时调用execute执行这个RunnableFuture实例。
*
* @throws RejectedExecutionException 如果任务无法安排执行
* @throws NullPointerException 如果该任务为 null
*/
public Future submit(Callable task) {
//首先就是task任务的null校验,如果为null直接抛出NullPointerException
if (task == null) throw new NullPointerException();
//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,get返回指定值
RunnableFuture ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
/**
* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture的返回值result就是传递的Callable的call方法的返回值,并为底层任务提供取消等操作。
*
* @param callable 被包装的任务
* @param Callable返回值类型
* @return 为给定可运行任务返回一个 RunnableFuture。
*/
protected RunnableFuture newTaskFor(Callable callable) {
//调用FutureTask的构造器
return new FutureTask(callable);
}