首先说一下,Executor、ExecutorService和Future这三个类都是接口,如下所示:
public interface Executor
public interface ExecutorService extends Executor
public interface Future<V>
我们可以看到ExecutorService继承Executor,那这三个东西是干嘛的呢,来看看源码。(接口源码有啥好看的)
public interface Executor {
void execute(Runnable command);
}
Executor就一个执行方法,传入一个Runnable,很显然是要执行这个Runnable了。
Executor类给人一种什么感觉呢,执行任务。
这种接口我们也能写出来啊。
然后我们再看看Future,Future直接就要传递一个泛型,然而我们并不知道这个泛型是要干啥,不如看看源码。
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
所以这些源码看着像啥,我能根据Executor接口的方法,猜到execute方法是干啥的,但是只看Future的接口方法我是根本不知道这些方法是干嘛的。
还是看注释吧。
cancel方法代表去取消这个任务,参数代表这个任务是否可以被中断。
isCancelled返回boolean表示是否被中断了
isDone表示方法执行完毕了
get获取任务执行的结果
get(带参)代表方法要在规定时间返回结果,你看这个方法异常多的不得了,就知道这个方法要求高了。
Future这个类给人一种什么感觉呢,就是这个类就是为了得到运行结果,或者中断任务的。
接下来我们来看看比较多的ExecutorService。
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
跳过源码看这里来了?不想看那些源码是对的,放我我也不想看,看着乱七八糟的,不知道看什么好。
把这些方法分成不同的类型吧。
shutdown、Terminated、submit、invoke
这些方法大概就这四种风格。
shutdown代表关闭任务
Terminated代表中断任务
submit提供runnable执行任务
invoke准备好要被执行的任务
看着是不是清晰一点。
Executor类是为了执行任务,ExecutorService好像也是为了执行任务。
不过ExecutorService要管的事情好像多了很多。
又要中断,又要关闭,又要提供runnable执行那些任务。
所以这三个类之间的关系是一个怎样的关系呢。
ExecutorService继承Executor,所以就不说了,都是为了执行任务
ExecutorService执行任务,Future是任务执行的结果,大概就这个关系。
over!