java入门之ExecutorService接口
白羽 2018-07-09 来源 :网络 阅读 722 评论 0

摘要:本文将带你了解java入门之ExecutorService接口,希望本文对大家学JAVA有所帮助。


一、声明

public interface ExecutorService extends Executor     位于java.util.concurrent包下

所有超级接口:Executor

所有已知子接口:ScheduledExecutorService

所有已知实现类:AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor

二、概述

Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。

可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService 以允许回收其资源。

通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用ExecutorCompletionService 类来编写这些方法的自定义变体)。

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

下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:

[java] view plain copy

1. class NetworkService implements Runnable {  

2.    private final ServerSocket serverSocket;  

3.    private final ExecutorService pool;  

4.   

5.    public NetworkService(int port, int poolSize)  

6.        throws IOException {  

7.      serverSocket = new ServerSocket(port);  

8.      pool = Executors.newFixedThreadPool(poolSize);  

9.    }  

10.   

11.    public void run() { // run the service  

12.      try {  

13.        for (;;) {  

14.          pool.execute(new Handler(serverSocket.accept()));  

15.        }  

16.      } catch (IOException ex) {  

17.        pool.shutdown();  

18.      }  

19.    }  

20.  }  

21.   

22.  class Handler implements Runnable {  

23.    private final Socket socket;  

24.    Handler(Socket socket) { this.socket = socket; }  

25.    public void run() {  

26.      // read and service request on socket  

27.    }  

28. }  

下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务:

[java] view plain copy

1. void shutdownAndAwaitTermination(ExecutorService pool) {  

2.    pool.shutdown(); // Disable new tasks from being submitted  

3.    try {  

4.      // Wait a while for existing tasks to terminate  

5.      if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {  

6.        pool.shutdownNow(); // Cancel currently executing tasks  

7.        // Wait a while for tasks to respond to being cancelled  

8.        if (!pool.awaitTermination(60, TimeUnit.SECONDS))  

9.            System.err.println("Pool did not terminate");  

10.      }  

11.    } catch (InterruptedException ie) {  

12.      // (Re-)Cancel if current thread also interrupted  

13.      pool.shutdownNow();  

14.      // Preserve interrupt status  

15.      Thread.currentThread().interrupt();  

16.    }  

17.  }  

内存一致性效果:线程中向 ExecutorService 提交 Runnable 或 Callable 任务之前的操作happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 Future.get() 获取的结果。

从以下版本开始:1.5

三、方法详细

1、void shutdown()

启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。

抛出: SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒绝访问。

 

2、List<Runnable> shutdownNow()  试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过 Thread.interrupt() 来取消典型的实现,所以任何任务无法响应中断都可能永远无法终止。

返回: 从未开始执行的任务的列表

抛出: SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒绝访问。

 

3、boolean isShutdown()    如果此执行程序已关闭,则返回 true。

 

4、boolean isTerminated()  如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用shutdown 或 shutdownNow,否则 isTerminated 永不为 true。

 

5、boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException

请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。

参数:timeout - 最长等待时间

unit - timeout 参数的时间单位

返回:如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false

抛出:InterruptedException - 如果等待时发生中断

 

6、<T> Future<T> submit(Callable<T> task) 

提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。

如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造。

注:Executors 类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,例如,将 PrivilegedAction 转换为Callable 形式,这样就可以提交它们了。

参数: task - 要提交的任务

返回: 表示任务等待完成的 Future

抛出: RejectedExecutionException - 如果任务无法安排执行

NullPointerException - 如果该任务为 null

 

7、<T> Future<T> submit(Runnable task, T result) 

提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。

参数: task - 要提交的任务 result - 返回的结果

返回: 表示任务等待完成的 Future

抛出: RejectedExecutionException - 如果任务无法安排执行

              NullPointerException - 如果该任务为 null

 

8、Future<?> submit(Runnable task)

提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回null。

参数:task - 要提交的任务

返回:表示任务等待完成的 Future

抛出:RejectedExecutionException - 如果任务无法安排执行

           NullPointerException - 如果该任务为 null

 

9、<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException

执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为true。注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。

参数:tasks - 任务 collection

返回:表示任务的 Future 列表,列表顺序与给定任务列表的迭代器所生成的顺序相同,每个任务都已完成。

抛出:InterruptedException - 如果等待时发生中断,在这种情况下取消尚未完成的任务。

NullPointerException - 如果任务或其任意元素为 null

RejectedExecutionException - 如果所有任务都无法安排执行

 

10、<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 - 如果所有任务都无法安排执行

 

11、<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException

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

参数:tasks - 任务 collection

返回:某个任务返回的结果

抛出:InterruptedException - 如果等待时发生中断

      NullPointerException - 如果任务或其任意元素为 null

      IllegalArgumentException - 如果任务为空

      ExecutionException - 如果没有任务成功完成

      RejectedExecutionException - 如果任务无法安排执行

 

12、<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 - 如果任务无法安排执行

 


以上就介绍了JAVA的相关知识,希望对JAVA有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言JAVA频道!





本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved