Java CompletionService 理解

CompletionService是一个抽象的java泛型接口,它被ExecutorCompletionService泛型类实现,具体功能是将生产的任务和生产任务产生的结果分离。生产者通过submit提交任务,消费生产结构通过take获取任务放回的结果,然后做其他的处理。CompletionService 一般用于需要异步操作的地方,比如网络请求,文件io等耗时的操作中。ExecutorCompletionService 维护一个提交任务的Future BlockingQueue。ExecutorCompletionService 将Executor(线程池)和BlockingQueue(阻塞队列)结合在一起,同时使用Callable作为任务的基本单元,整个过程就是生产者不断把Callable任务放入阻塞对了,Executor作为消费者不断把任务取出来执行,并返回结果;下面通过一个案例来演示一下它们的使用:

public class MyCompletionService {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
ExecutorService exec = Executors.newFixedThreadPool(5);
CompletionService<MyObject> serv = new ExecutorCompletionService<MyObject>(
exec);
for (int index = 0; index < 5; index++) {
final int id = index;
/** 任务执行单元,任务执行返回一个结构, **/
Callable<MyObject> downImg = new Callable<MyObject>() {
public MyObject call() throws Exception {
//模拟执行超时任务
Thread.sleep(1000);
return new MyObject(id, "妞妞" + id);
}
};
serv.submit(downImg);
}
/** 从ExecutorCompletionService的队列中获取一个已经完成的Future,然后从Future里获取结构 **/
for (int index = 0; index < 5; index++) {
//如果队列有结果返回,就取出来处理,如果没有就等待
Future<MyObject> task = serv.take();
MyObject mMyObject = task.get();
System.out.println("MyObject= " + mMyObject.toString());
}
System.out.println("End");
// 关闭线程池
exec.shutdown();
}


}


class MyObject {
private int id;
private String name;


public MyObject(int id, String name) {
this.id = id;
this.name = name;
}


@Override
public String toString() {
return "MyObject [id=" + id + ", name=" + name + "]";
}


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值