JDK1.8源码解读之 ExecutorService

689 阅读4分钟

前言

  • 一种{@link Executor},提供管理终止的方法以及可以产生{@link Future}来跟踪一个或多个异步任务进度的方法。
  • 可以关闭{@code ExecutorService},这将导致它拒绝新任务。
  • 提供了两种不同的方法来关闭{@code ExecutorService}。
  • {@link #shutdown}方法将允许先前提交的任务在终止之前执行,
  • 而{@link #shutdownNow}方法可防止等待的任务启动并尝试停止当前正在执行的任务。
  • 终止后,执行者将没有正在执行的任务,没有正在等待执行的任务,并且无法提交新任务。
  • 应该关闭未使用的{@code ExecutorService}以回收其资源。
  • 方法{@code Submit}通过创建并返回一个可用于取消执行和/或等待完成的{@link Future}来扩展基本方法{@link Executor#execute(Runnable)}。
  • 方法{@code invokeAny}和{@code invokeAll}执行批量执行的最常用形式,执行一组任务,然后等待至少一个或全部完成。
  • (类{@link ExecutorCompletionService}可用于编写这些方法的自定义变体。)
  • {@link Executors}类为此包中提供的执行程序服务提供了工厂方法。

源码

package java.util.concurrent;
public interface ExecutorService extends Executor {

    /**
     * 启动有序关闭,在该关闭中执行先前提交的任务,但不接受任何新任务。如果已关闭,则调用不会产生任何其他影响。
     */
    void shutdown();

    /**
     * 尝试停止所有正在执行的任务,中止正在等待的任务的处理,并返回正在等待执行的任务的列表。
     * 此方法不等待主动执行的任务终止。
     * 使用{@link #awaitTermination awaitTermination}可以做到这一点。
     * 除了尽最大努力阻止停止处理正在执行的任务之外,没有任何保证。
     * 例如,典型的实现将通过{@link Thread#interrupt}取消,因此任何无法响应中断的任务都可能永远不会终止。
     */
    List<Runnable> shutdownNow();

    boolean isShutdown();

    boolean isTerminated();

    /**
     * 阻塞直到关闭请求后所有任务完成执行,或者发生超时,或者当前线程被中断(以先发生者为准)。
     */
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 提交执行任务的返回值任务,并返回表示任务的未决结果的Future。
     * Future的{@code get}方法将在成功完成后返回任务的结果。
     * 如果您想立即阻止等待任务,则可以使用以下形式的构造:{@code result = exec.submit(aCallable).get();}
     * 注意:{@link Executors}类包含一组方法可以将其他一些类似闭包的常见对象转换为{@link Callable}形式,
     * 例如将{@link java.security.PrivilegedAction}转换为{@link Callable}形式。
     */
    <T> Future<T> submit(Callable<T> task);

    /**
     * 提交一个Runnable任务以执行并返回一个代表该任务的Future。 Future的{@code get}方法将在成功完成后返回给定的结果。
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交一个Runnable任务以执行并返回一个代表该任务的Future。成功完成后,Future的{@code get}方法将返回{@code null}。
     */
    Future<?> submit(Runnable task);

    /**
     * 执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。
     * 对于返回列表的每个元素,{@link Future#isDone}为{@code true}。
     * 请注意,已完成的任务可能已正常终止或引发了异常。
     * 如果在进行此操作时修改了给定的集合,则此方法的结果不确定。
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;

    /**
     * 执行给定的任务,并在所有完成或超时到期时(以先发生者为准)返回持有其状态和结果的期货列表。
     * 对于返回列表的每个元素,{@link Future#isDone}为{@code true}。
     * 返回时,将取消尚未完成的任务。请注意,已完成的任务可能已正常终止或引发了异常。
     * 如果在进行此操作时修改了给定的集合,则此方法的结果不确定。
     */
    <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;
}