深入学习理解java:CompletionService解决ExecutorService的submit方法的缺点
2016-06-27 17:49
591 查看
在ExecutorService的submit方法中可以获取返回值,通过Future的get方法,但是这个Future类存在缺陷,Future接口调用get()方法取得处理后的返回结果时具有阻塞性,也就是说调用Future的get方法时,任务没有执行完成,则get方法要一直阻塞等到任务完成为止。
这样大大的影响了系统的性能,这就是Future的最大缺点。为此,java1.5以后提供了CompletionServlice来解决这个问题。
CompletionService
接口CompletionService的功能是异步的方式,一边生产任务,一边处理完成的任务结果,这样可以将执行的任务与处理任务隔离开来进行处理,使用submit执行任务,使用塔克获取已完成的任务,并按照这些任务的完成的时间顺序来处理他们的结果。
如图这个是CompletionService的核心方法
其有构造器如下;
可以发现,需要传入一个executor,
下面demo来解释CompletionService解决Future的缺点。
首先创建一个类
测试方法
运行效果
如此一来,,,,哈哈!Android的mvp你懂得!!!!
这样大大的影响了系统的性能,这就是Future的最大缺点。为此,java1.5以后提供了CompletionServlice来解决这个问题。
CompletionService
接口CompletionService的功能是异步的方式,一边生产任务,一边处理完成的任务结果,这样可以将执行的任务与处理任务隔离开来进行处理,使用submit执行任务,使用塔克获取已完成的任务,并按照这些任务的完成的时间顺序来处理他们的结果。
如图这个是CompletionService的核心方法
其有构造器如下;
CompletionService<T> completionService=new ExecutorCompletionService<T>(executorService);
可以发现,需要传入一个executor,
下面demo来解释CompletionService解决Future的缺点。
首先创建一个类
package com.completion; import java.util.concurrent.Callable; public class MyCallable implements Callable<String>{ private String name; private long sleep; public MyCallable(String name,long sleep) { super(); this.name=name; this.sleep=sleep; } @Override public String call() throws Exception { Thread.sleep(sleep); return "call()---->"+name; } }
测试方法
package com.completion; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.annotation.processing.Completion; public class Test { public static void main(String[] args) throws InterruptedException, ExecutionException { //模拟不同的耗时 MyCallable callable=new MyCallable("小double", 1000); MyCallable callable1=new MyCallable("大double", 4000); MyCallable callable2=new MyCallable("中double", 3000); List<Callable<String>>list=new ArrayList<>(); list.add(callable); list.add(callable1); list.add(callable2); ExecutorService executorService=Executors.newCachedThreadPool(); CompletionService<String>completionService=new ExecutorCompletionService<>(executorService); for (Callable<String>ca:list) { completionService.submit(ca); } for (Callable<String>ca:list) { System.out.println("-------------"); System.err.println(completionService.take().get()); } } }
运行效果
如此一来,,,,哈哈!Android的mvp你懂得!!!!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树