并发学习计划-Executor、ExecutorService和Future的关系01

首先说一下,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!

猜你喜欢

转载自blog.csdn.net/weixin_33691598/article/details/86822613