`
abc20899
  • 浏览: 937585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
ExecutorService
java.util.concurrent
接口 ExecutorService
所有超级接口:
    Executor
所有已知子接口:
    ScheduledExecutorService
所有已知实现类:
    AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor
ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。
shutdown()方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务的启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService以允许回收其资源。
通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法submit扩展了基本方法 Executor.execute(java.lang.Runnable)。
方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,
或全部任务完成(可使用 ExecutorCompletionService类来编写这些方法的自定义变体)。
Executors类为创建ExecutorService提供了便捷的工厂方法。
注意1:它只有一个直接实现类ThreadPoolExecutor和间接实现类ScheduledThreadPoolExecutor。
关于ThreadPoolExecutor的更多内容请参考《ThreadPoolExecutor》
关于ScheduledThreadPoolExecutor的更多内容请参考《ScheduledThreadPoolExecutor》
用法示例
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 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。第一阶段调用 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();
   }
}
内存一致性效果:线程中向 ExecutorService 提交 Runnable 或 Callable 任务之前的操作 happen-before 由该任务所提取的所有操作,
后者依次 happen-before 通过 Future.get() 获取的结果。
主要函数:
void shutdown()
    启动一个关闭命令,不再接受新任务,当所有已提交任务执行完后,就关闭。如果已经关闭,则调用没有其他作用。
    抛出:
        SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持 RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒绝访问。
List<Runnable> shutdownNow()
    试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
    无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过 Thread.interrupt() 来取消典型的实现,所以任何任务无法响应中断都可能永远无法终止。
    返回:
        从未开始执行的任务的列表
    抛出:
        SecurityException - 如果安全管理器存在并且关闭,
        此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持 RuntimePermission("modifyThread")),
        或者安全管理器的 checkAccess 方法拒绝访问。
注意1:它会返回等待执行的任务列表。
注意2:法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过 Thread.interrupt() 来取消典型的实现,
所以任何任务无法响应中断都可能永远无法终止。
boolean isShutdown()
    如果此执行程序已关闭,则返回 true。
    返回:
        如果此执行程序已关闭,则返回 true
boolean isTerminated()
    如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。
    返回:
        如果关闭后所有任务都已完成,则返回 true
boolean awaitTermination(long timeout,TimeUnit unit) throws InterruptedException
        等待(阻塞)直到关闭或最长等待时间或发生中断
    参数:
        timeout - 最长等待时间
        unit - timeout 参数的时间单位
    返回:
        如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false
    抛出:
        InterruptedException - 如果等待时发生中断
注意1:如果此执行程序终止(关闭),则返回 true;如果终止前超时期满,则返回 false
<T> Future<T> submit(Callable<T> task)
    提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。
    如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造。
    注:Executors 类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,
    例如,将 PrivilegedAction 转换为 Callable 形式,这样就可以提交它们了。
    参数:
        task - 要提交的任务
    返回:
        表示任务等待完成的 Future
    抛出:
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果该任务为 null
注意:关于submit的使用和Callable可以参阅《Callable》
<T> Future<T> submit(Runnable task,T result)
    提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。
    参数:
        task - 要提交的任务
        result - 返回的结果
    返回:
        表示任务等待完成的 Future
    抛出:
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果该任务为 null
注意:关于submit的使用可以参阅《Callable》
Future<?> submit(Runnable task)
    提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回 null。
    参数:
        task - 要提交的任务
    返回:
        表示任务等待完成的 Future
    抛出:
        RejectedExecutionException - 如果任务无法安排执行
        NullPointerException - 如果该任务为 null
注意:关于submit的使用可以参阅《Callable》
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)    throws InterruptedException
    执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。
    注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。
    参数:
        tasks - 任务 collection
    返回:
        表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同,每个任务都已完成。
    抛出:
        InterruptedException - 如果等待时发生中断,在这种情况下取消尚未完成的任务。
        NullPointerException - 如果任务或其任意元素为 null
        RejectedExecutionException - 如果所有任务都无法安排执行
注意1:该方法会一直阻塞直到所有任务完成。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                              long timeout,
                              TimeUnit unit)
                          throws InterruptedException
    执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。一旦返回后,即取消尚未完成的任务。注意,可以正常地或通过抛出异常来终止已完成 任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
    参数:
        tasks - 任务 collection
        timeout - 最长等待时间
        unit - timeout 参数的时间单位
    返回:
        表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同。
        如果操作未超时,则已完成所有任务。如果确实超时了,则某些任务尚未完成。
    抛出:
        InterruptedException - 如果等待时发生中断,在这种情况下取消尚未完成的任务
        NullPointerException - 如果任务或其任意元素或 unit 为 null
        RejectedExecutionException - 如果所有任务都无法安排执行
注意1:该方法会一直阻塞直到所有任务完成或超时。
注意2:如果确实超时了,则某些任务尚未完成。【那么这些尚未完成的任务应该被系统取消】。
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException,
                   ExecutionException
    执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。
    如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
    参数:
        tasks - 任务 collection
    返回:
        某个任务返回的结果
    抛出:
        InterruptedException - 如果等待时发生中断
        NullPointerException - 如果任务或其任意元素为 null
        IllegalArgumentException - 如果任务为空
        ExecutionException - 如果没有任务成功完成
        RejectedExecutionException - 如果任务无法安排执行
注意1:该方法会一直阻塞直到有一个任务完成。
注意2:一旦正常或异常返回后,则取消尚未完成的任务
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
                long timeout,
                TimeUnit unit)
            throws InterruptedException,
                   ExecutionException,
                   TimeoutException

    执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。

    参数:
        tasks - 任务 collection
        timeout - 最长等待时间
        unit - timeout 参数的时间单位
    返回:
        某个任务返回的结果
    抛出:
        InterruptedException - 如果等待时发生中断
        NullPointerException - 如果任务或其任意元素或 unit 为 null
        TimeoutException - 如果在所有任务成功完成之前给定的超时期满
        ExecutionException - 如果没有任务成功完成
        RejectedExecutionException - 如果任务无法安排执行
注意1:该方法会一直阻塞直到有一个任务完成。
注意2:一旦正常或异常返回后,则取消尚未完成的任务
分享到:
评论

相关推荐

    在spring boot中使用java线程池ExecutorService的讲解

    在 Spring Boot 中使用 Java 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...

    ExecutorService与CompletionService对比详解.docx

    ExecutorService 和 CompletionService 是Java并发处理中的两种工具,它们用于管理和执行多个任务。ExecutorService 是一个接口,它是java.util.concurrent.Executor 接口的扩展,提供了一组方法来管理和控制线程池...

    Executor,Executors,ExecutorService比较.docx

    【Executor、Executors和ExecutorService详解】 在Java并发编程中,`Executor`、`Executors`和`ExecutorService`是核心组件,它们帮助开发者高效管理线程资源,提高程序的并发性能。理解这三个概念的区别和用途是...

    ExecutorService的execute和submit方法

    在Java多线程编程中,`ExecutorService`是线程池的核心接口,它提供了一种管理线程的方式,包括创建线程、调度线程执行以及控制线程的生命周期。`ExecutorService`通过`execute()`和`submit()`这两个方法来提交任务...

    ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭

    在Java多线程编程中,`ExecutorService`是线程池的一个重要接口,它提供了管理和控制线程执行的能力。当我们创建一个`ExecutorService`实例并提交任务时,我们可以通过调用`shutdown()`方法来关闭线程池。然而,标题...

    ExecutorService方法案例文件.zip

    ExecutorService方法案例文件.zip

    ExecutorService用法详解.doc

    接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现...

    ExecutorService线程池

    ExecutorService线程池是Java并发编程中的核心组件,它位于`java.util.concurrent`包下,是`java.util.concurrent.Executor`接口的一个实现。ExecutorService提供了一种管理线程的方式,允许我们创建、管理和控制...

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接JAVA语言

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接

    2_ExecutorService源码阅读1

    ExecutorService 是 Java 中用于管理和控制线程执行的核心接口,它是 java.util.concurrent 包的一部分。ExecutorService 扩展了 Executor 接口,提供了更丰富的功能,如任务的提交、关闭服务、检查服务状态等。这个...

    java并发编程:Executor、Executors、ExecutorService.docx

    Java并发编程中的Executor、Executors和ExecutorService是Java并发编程框架的重要组成部分,它们为开发者提供了高效管理和控制线程执行的工具。以下是对这些概念的详细解释: 1. Executor: Executor是一个接口,它...

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc

    根据提供的文档标题、描述以及部分内容,我们可以总结出以下关于如何运用Java中的`concurrent.ExecutorService`线程池实现socket的TCP和UDP连接的关键知识点: ### 1. 理解Java中的`concurrent.ExecutorService` `...

    2011.08.30(2)——— java BlockingQueue ExecutorService

    标题 "2011.08.30(2)——— java BlockingQueue ExecutorService" 涉及到Java并发编程中的两个核心组件:BlockingQueue(阻塞队列)和ExecutorService。这篇博客可能深入探讨了如何使用这两个工具来优化多线程环境...

    详解Java利用ExecutorService实现同步执行大量线程

    Java中的ExecutorService是Java并发编程的重要组成部分,它提供了一种高效、灵活的方式来管理和控制线程的执行。在处理大量线程或并发操作时,ExecutorService能够确保系统的稳定性和资源的有效利用,避免线程间的不...

    java ExecutorService使用方法详解

    Java中的`ExecutorService`是Java并发编程的重要组成部分,它提供了线程池的管理,使得开发者可以更有效地控制并发任务的执行。在Java的`java.util.concurrent`包中,`ExecutorService`接口作为线程池的核心接口,...

    java线程池工具--ExecutorService,简单例子

    NULL 博文链接:https://x125858805.iteye.com/blog/2191873

    Java使用ExecutorService来停止线程服务

    Java 使用 ExecutorService 来停止线程服务 Java 中的 ExecutorService 是一个非常强大的线程池管理工具,它提供了多种方式来停止线程服务。今天,我们将详细介绍如何使用 ExecutorService 来停止线程服务。 首先...

    ExecutorService10个要诀和技巧编程开发技术

    ExecutorService10个要诀和技巧编程开发技术共9页.pdf.zip

    详解JDK中ExecutorService与Callable和Future对线程的支持

    Java并发编程中的ExecutorService、Callable和Future Java并发编程中,ExecutorService、Callable和Future是三大核心组件,它们之间紧密相连,共同实现了高效、安全的并发编程。下面我们将详细介绍这些组件的作用和...

Global site tag (gtag.js) - Google Analytics