今天我们来说一下另一个用的频率比较高的提交任务的方法submit,ThreadPoolExecutor的submit是继承AbstractExecutorService获得的。
image.png
submit有三个重载方法:

第一个重载方法,参数Runnable,不指定泛型类型,返回的也是通配符泛型类型。
第二个重载方法,参数Runnable,指定泛型类型
第三个重载方法,参数Callable,指定泛型类型
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
public <T> Future<T> submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
可以看到三个方法都通过newTaskFor方法得到了一个RunnableFuture对象,然后调用execute方法执行RunnableFuture的任务,并且返回了RunnableFuture。
这个RunnableFuture继承了Runnable和Future,既是一个可以执行的任务,又是一个异步计算的结果。
public interface RunnableFuture<V> extends Runnable, Future<V> {
/**
* Sets this Future to the result of its computation
* unless it has been cancelled.
*/
void run();
}
newTaskFor的源码也比较简单:
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable);
}
FutureTask表示可以取消的异步计算任务。它可以获取任务执行结果、取消任务执行、查看任务是否已经执行完成等等。并且实现了RunnableFuture,所以newTaskFor方法可以直接返回它。
public class FutureTask<V> implements RunnableFuture<V> {
}
下面一张UML图表示了上面角色之间的关系
image.png
网友评论