本文内容转自 http://www.iteye.com/topic/366591

Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:

并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。

一、创建线程池

Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

public static ExecutorService newFixedThreadPool(int nThreads)

创建固定数目线程的线程池。

public static ExecutorService newCachedThreadPool()

创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

public static ExecutorService newSingleThreadExecutor()

创建一个单线程化的Executor。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

二、ExecutorService与生命周期

ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态,运行 ,关闭 ,终止。Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true。

如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException。

三、使用Callable,Future返回结果

Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。

例子:并行计算数组的和。

 Main

  1. int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11 };
  2. ConcurrentCalculator calc = new ConcurrentCalculator();
  3. Long sum = calc.sum(numbers);
  4. System.out.println(sum);
  5. calc.close();

四、CompletionService

在刚在的例子中,getResult()方法的实现过程中,迭代了FutureTask的数组,如果任务还没有完成则当前线程会阻塞,如果我们希望任意字任务完成后就把其结果加到result中,而不用依次等待每个任务完成,可以使CompletionService。生产者submit()执行的任务。使用者take()已完成的任务,并按照完成这些任务的顺序处理它们的结果 。也就是调用CompletionService的take方法是,会返回按完成顺序放回任务的结果,CompletionService内部维护了一个阻塞队列BlockingQueue,如果没有任务完成,take()方法也会阻塞。修改刚才的例子使用CompletionService:

最新文章

  1. 大三作品:不需要售货员的超市? Easy-Shopping超市导购系统
  2. MySQL高级查询 之 与 Group By 一起使用的函数 和 关键字
  3. ajax请求加载Loading或错误提示
  4. PNG与iOS优化选项
  5. ios严格检验身份证号码有效性
  6. h5在微信中不允许放大缩小页面
  7. 使用Express搭建服务器
  8. oracle 异常管理
  9. jquery简单的拖动效果
  10. JavaScript两个变量交换值(不使用临时变量)
  11. httpclient的理解(代码理解)
  12. Java:bufferedReader.readLine()读取文件换行问题
  13. 运行SSIS包的六种方式
  14. WordCount
  15. mysql 查询 两个表中不同字段的 和,并通过两个表的时间来分组
  16. CSS3--2D&amp;3D的使用
  17. lightoj1336 约数和
  18. 如何在framegroup各个frame和window之间共享数据
  19. mac connect to host localhost port 22: Connection refused
  20. Spring boot 启动配置原理

热门文章

  1. 在VS2017环境中编译libxml2库
  2. [转载] 把Nutch爬虫部署到Hadoop集群上
  3. android 获取短信验证码倒计时
  4. js格式化货币金额
  5. 谷歌浏览器chrome上的firepath ----chropath
  6. java中接口的概念及使用(补充final修饰符的使用)
  7. C#判断VS是否处于设计模式
  8. Linux tar.gz 、zip、rar 解压 压缩命令
  9. hdu-5653 Bomber Man wants to bomb an Array.(区间dp)
  10. python 标准库 —— http(http.cookiejar)