Module  java.base
软件包  java.util.concurrent

Interface ExecutorService

  • All Superinterfaces:
    Executor
    All Known Subinterfaces:
    ScheduledExecutorService
    所有已知实现类:
    AbstractExecutorServiceForkJoinPoolScheduledThreadPoolExecutorThreadPoolExecutor


    public interface ExecutorService
    extends Executor
    一个Executor提供了管理终止的方法和可以产生用于跟踪一个或多个异步任务进度的Future方法。

    一个ExecutorService可以关闭,这将导致它拒绝新的任务。 提供了两种不同的方法来关闭ExecutorService shutdown()方法将允许先前提交的任务在终止之前执行,而shutdownNow()方法可以防止等待任务启动并尝试停止当前正在执行的任务。 一旦终止,执行者没有任务正在执行,没有任务正在等待执行,并且不能提交新的任务。 应关闭未使用的ExecutorService ,以便资源回收。

    方法submit延伸的基方法Executor.execute(Runnable)通过创建并返回一个Future可用于取消执行和/或等待完成。 方法invokeAnyinvokeAll执行批量执行最常用的形式,执行任务集合,然后等待至少一个或全部完成。 ExecutorCompletionService类可用于编写这些方法的自定义变体。)

    Executors类为此包中提供的执行程序服务提供了工厂方法。

    用法示例

    这是一个网络服务的草图,其中线程池中的线程服务传入请求。 它使用预配置的Executors.newFixedThreadPool(int)工厂方法:
       class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); pool = Executors.newFixedThreadPool(poolSize); } public void run() { // run the service try { for (;;) { pool.execute(new Handler(serverSocket.accept())); } } catch (IOException ex) { pool.shutdown(); } } } class Handler implements Runnable { private final Socket socket; Handler(Socket socket) { this.socket = socket; } public void run() { // read and service request on socket } } 
    以下方法ExecutorService两个阶段关闭ExecutorService ,首先通过拨打shutdown拒绝接收任务,然后调用shutdownNow ,如有必要,可以取消任何延迟任务:
       void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); // Cancel currently executing tasks // Wait a while for tasks to respond to being cancelled if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } } catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } } 

    内存一致性效果:操作在提交之前的螺纹RunnableCallable任务到ExecutorService happen-before由任务采取的任何行动,这反过来又发生-之前结果通过检索Future.get()

    从以下版本开始:
    1.5
    • 方法摘要

      所有方法  接口方法  抽象方法 
      Modifier and Type 方法 描述
      boolean awaitTermination​(long timeout, TimeUnit unit)
      阻止所有任务在关闭请求完成后执行,或发生超时或当前线程中断,以先到者为准。
      <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks)
      执行给定的任务,返回持有他们的状态和结果的所有完成的期货列表。
      <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
      执行给定的任务,返回在所有完成或超时到期时持有其状态和结果的期货列表,以先发生者为准。
      <T> T invokeAny​(Collection<? extends Callable<T>> tasks)
      执行给定的任务,返回成功完成的结果(即,不抛出异常),如果有的话。
      <T> T invokeAny​(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
      执行给定的任务,返回一个已经成功完成的结果(即,不抛出异常),如果在给定的时间超过之前有的话。
      boolean isShutdown​()
      如果这个执行者已被关闭,则返回 true
      boolean isTerminated​()
      如果所有任务在关闭后完成,则返回 true
      void shutdown​()
      启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
      List<Runnable> shutdownNow​()
      尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。
      Future<?> submit​(Runnable task)
      提交一个可运行的任务执行,并返回一个表示该任务的未来。
      <T> Future<T> submit​(Runnable task, T result)
      提交一个可运行的任务执行,并返回一个表示该任务的未来。
      <T> Future<T> submit​(Callable<T> task)
      提交值返回任务以执行,并返回代表任务待处理结果的Future。
    • 方法详细信息

      • shutdown

        void shutdown​()
        启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的作用。

        此方法不等待以前提交的任务完成执行。 使用awaitTermination来做到这一点。

        异常
        SecurityException -如果安全管理器存在并且关闭,此ExecutorService可能操作的调用者不允许修改,因为它不保存线程RuntimePermission ("modifyThread") ,或者安全管理器的checkAccess方法拒绝。
      • shutdownNow

        List<Runnable> shutdownNow​()
        尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。

        此方法不等待主动执行的任务终止。 使用awaitTermination来做到这一点。

        除了努力尝试停止处理积极执行任务之外,没有任何保证。 例如,典型的实现将通过Thread.interrupt()取消,所以不能响应中断的任何任务可能永远不会终止。

        结果
        从未开始执行的任务列表
        异常
        SecurityException - 如果安全管理器存在并关闭此ExecutorService可能会操纵调用者不允许修改的线程,因为它不保留RuntimePermission ("modifyThread")或安全管理器的checkAccess方法拒绝访问。
      • isShutdown

        boolean isShutdown​()
        如果此执行者已被关闭,则返回 true
        结果
        true如果这个执行者已被关闭
      • isTerminated

        boolean isTerminated​()
        如果所有任务在关闭后完成,则返回true 请注意, isTerminated从不是true除非shutdownshutdownNow被称为第一。
        结果
        true如果所有任务在关闭后完成
      • awaitTermination

        boolean awaitTermination​(long timeout,
                                 TimeUnit unit)
                          throws InterruptedException
        阻止所有任务在关闭请求完成后执行,或发生超时或当前线程中断,以先到者为准。
        参数
        timeout - 等待的最长时间
        unit - 超时参数的时间单位
        结果
        true如果这个执行者终止,而 false如果终止之前的超时时间
        异常
        InterruptedException - 如果中断等待
      • submit

        <T> Future<T> submit​(Callable<T> task)
        提交值返回任务以执行,并返回代表任务待处理结果的Future。 get

        如果您想立即阻止等待任务,您可以使用result = exec.submit(aCallable).get();格式的result = exec.submit(aCallable).get();

        注意: Executors类包括一组可以将其他常见的类似闭包的对象(例如PrivilegedAction)转换Callable表单的方法,以便它们可以提交。

        参数类型
        T - 任务结果的类型
        参数
        task - 提交的任务
        结果
        一个未来的代表,待完成任务
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果任务为空
      • submit

        <T> Future<T> submit​(Runnable task,
                             T result)
        提交一个可运行的任务执行,并返回一个表示该任务的未来。 未来的get方法将在成功完成后返回给定的结果。
        参数类型
        T - 结果的类型
        参数
        task - 要提交的任务
        result - 结果返回
        结果
        一个未来的代表,待完成任务
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果任务为空
      • submit

        Future<?> submit​(Runnable task)
        提交一个可运行的任务执行,并返回一个表示该任务的未来。 未来的get方法将在成功完成后返回null
        参数
        task - 要提交的任务
        结果
        一个未来的代表,待完成任务
        异常
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果任务为空
      • invokeAll

        <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks)
                               throws InterruptedException
        执行给定的任务,返回持有他们的状态和结果的所有完成的期货列表。 Future.isDone()true的返回列表的每个元素。 请注意, 完成的任务可能会正常终止或抛出异常。 如果在此操作进行过程中修改了给定的集合,则此方法的结果是未定义的。
        参数类型
        T - 从任务返回的值的类型
        参数
        tasks - 任务的收集
        结果
        表示任务的期货列表,按照给定任务列表的迭代器产生的顺序顺序,每个都已完成
        异常
        InterruptedException - 如果在等待时中断,在这种情况下未完成的任务被取消
        NullPointerException - 如果任务或其任何元素是 null
        RejectedExecutionException - 如果任何任务无法安排执行
      • invokeAll

        <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks,
                                      long timeout,
                                      TimeUnit unit)
                               throws InterruptedException
        执行给定的任务,返回在所有完成或超时到期时持有其状态和结果的期货列表,以先发生者为准。 对于返回的列表的每个元素, Future.isDone()true 退货后,尚未完成的任务将被取消。 请注意, 完成的任务可能会正常终止或抛出异常。 如果在此操作进行过程中修改了给定的集合,则此方法的结果是未定义的。
        参数类型
        T - 从任务返回的值的类型
        参数
        tasks - 任务的收集
        timeout - 等待的最长时间
        unit - 超时参数的时间单位
        结果
        一个表示任务的期货列表,按照给定任务列表的迭代器生成的顺序。 如果操作没有超时,每个任务都会完成。 如果超时,其中一些任务将不会完成。
        异常
        InterruptedException - 如果在等待时中断,在这种情况下未完成的任务将被取消
        NullPointerException - 如果任务,其任何元素或单位是 null
        RejectedExecutionException - 如果任何任务无法安排执行
      • invokeAny

        <T> T invokeAny​(Collection<? extends Callable<T>> tasks,
                        long timeout,
                        TimeUnit unit)
                 throws InterruptedException,
                        ExecutionException,
                        TimeoutException
        执行给定的任务,返回一个已经成功完成的结果(即,不抛出异常),如果在给定的时间超过之前有的话。 正常或异常退货后,尚未完成的任务将被取消。 如果在此操作进行过程中修改了给定的集合,则此方法的结果是未定义的。
        参数类型
        T - 从任务返回的值的类型
        参数
        tasks - 任务的收集
        timeout - 等待的最长时间
        unit - 超时参数的时间单位
        结果
        其中一个任务返回的结果
        异常
        InterruptedException - 如果在等待时中断
        NullPointerException - 如果任务或单位或任何要执行的元素任务是 null
        TimeoutException - 如果给定的超时在任务成功完成之前 TimeoutException
        ExecutionException - 如果没有任务成功完成
        RejectedExecutionException - if tasks cannot be scheduled for execution