Java中ExecutorService和CompletionService区别
来源:互联网 发布:淘宝客a5淘客交流 编辑:程序博客网 时间:2024/06/05 06:06
ExecutorService:等所有submit对象执行完,才会返回get值;
CompletionService:只要notEmpty,就会返回get值.(阻塞针对的是尾部full会阻塞,头部empty会阻塞)而CompletionService的实现是维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。所以,先完成的必定先被取出。这样就减少了不必要的等待时间
public
class
CompletionServiceTest {
static
class
Task implements Callable<String>{
private
int
i;
public
Task(
int
i){
this
.i = i;
}
@Override
public
String call() throws Exception {
Thread.sleep(10000);
return
Thread.currentThread().getName() +
"执行完任务:"
+ i;
}
}
public
static
void
main(String[] args){
testUseFuture();
}
private
static
void
testUseFuture(){
int
numThread = 5;
ExecutorService executor = Executors.newFixedThreadPool(numThread);
List<Future<String>> futureList =
new
ArrayList<Future<String>>();
for
(
int
i = 0;i<numThread;i++ ){
Future<String> future = executor.submit(
new
CompletionServiceTest.Task(i));
futureList.add(future);
}
while
(numThread > 0){
for
(Future<String> future : futureList){
String result =
null
;
try
{
result = future.
get
(0, TimeUnit.SECONDS);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
catch
(ExecutionException e) {
e.printStackTrace();
}
catch
(TimeoutException e) {
//超时异常直接忽略
}
if
(
null
!= result){
futureList.remove(future);
numThread--;
System.
out
.println(result);
//此处必须break,否则会抛出并发修改异常。(也可以通过将futureList声明为CopyOnWriteArrayList类型解决)
break
;
}
}
}
}
}
通过CompletionService包装ExecutorService,然后调用其take()方法去取Future对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public
class
CompletionServiceTest {
static
class
Task implements Callable<String>{
private
int
i;
public
Task(
int
i){
this
.i = i;
}
@Override
public
String call() throws Exception {
Thread.sleep(10000);
return
Thread.currentThread().getName() +
"执行完任务:"
+ i;
}
}
public
static
void
main(String[] args) throws InterruptedException, ExecutionException{
testExecutorCompletionService();
}
private
static
void
testExecutorCompletionService() throws InterruptedException, ExecutionException{
int
numThread = 5;
ExecutorService executor = Executors.newFixedThreadPool(numThread);
CompletionService<String> completionService =
new
ExecutorCompletionService<String>(executor);
for
(
int
i = 0;i<numThread;i++ ){
completionService.submit(
new
CompletionServiceTest.Task(i));
}
}
for
(
int
i = 0;i<numThread;i++ ){
System.
out
.println(completionService.take().
get
());
}
}
阅读全文
0 0
- Java中ExecutorService和CompletionService区别
- Java中ExecutorService和CompletionService区别
- Java中ExecutorService和CompletionService区别
- Java中ExecutorService和CompletionService区别
- ExecutorService和CompletionService的区别
- java并发编程学习-ExecutorService和CompletionService的区别
- Java 多线程中关于 ExecutorService 和 CompletionService的讨论
- CompletionService 和ExecutorService的区别和用法
- JAVA并发编程--ExecutorService与CompletionService
- Java ExecutorService中execute()和submit()方法的区别
- java CompletionService和ExecutorCompletionService
- ExecutorService与CompletionService
- ExecutorService中submit和execute的区别
- ExecutorService中submit和execute的区别
- ExecutorService中submit和execute的区别
- ExecutorService中submit和execute的区别
- 多线程ExecutorService中submit和execute区别
- ExecutorService中submit和execute的区别
- solr-6 查询中的可扩展插件
- ubuntu16.04 出现The program 'rpm' is currently not installed. You can install it by typing
- SDUT3899
- windows8.1+VBox+CentOS共享文件夹
- java.lang.NoClassDefFoundError: Failed resolution of
- Java中ExecutorService和CompletionService区别
- js实现Java中的静态变量
- 如何更快的拉取国内的docker镜像
- 2017.7.8 C组总结
- MySQL中高级知识-MySQL架构介绍
- 【Eternallyc】C++中的sort排序函数
- Unable to instantiate application com.yunque.www.yunque.app.YunQuApplication: java.lang.ClassNotFoun
- 前端代码规范
- Integer’s Power HDU