ExecutorService.submit()方法可以有两种入参
1、实现Callable接口的类
2、实现Runnable接口的类
两种 方式的源码其实很类似
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(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
他们都返回了一个Future 子类对象(其实都是 FutureTask 对象)这个对象在newTaskFor(task)方法中生成对象;
我们可以看到,真正的代码逻辑其实在execute(ftask)方法里,这个execute方法接受一个实现了 Runnable接口的参数。
public void execute(Runnable command) {
if (command == null)//任务必