当需要批量提交异步任务时,建议使用CompletionService,它集成了Executor和BlockingQueue的功能,使批量异步任务的管理更简单,执行结果更有序,在第一次执行后先进入阻塞队列,并隔离线程池,以避免线程饥饿。
工具/原材料的实现原则1 completionServiceExecutorCompletionServiceCompletionServiCe 1 completionServiCe的实现原则在内部维护一个阻塞队列。
1)当任务执行完成时,将任务执行结果的Future对象添加到阻塞队列中;
2)通过CompletionService提供的take()方法获取未来对象;
3)调用Future的get()方法返回执行结果。
ENDExecutorCompletionService简介1ExecutorCompletionService有两个构造函数:
步骤阅读2提交任务完成服务使用方法提交
-2步骤读取3获得执行结果,这些结果都与阻塞队列有关。
-3步读取结束示例1:查询功能1关键代码:图
-4步读取2源代码:
导入java.util.ArrayList。
导入Java . util . list;
导入Java . util . concurrent . *;
公共类CompletionServiceDemo {
公共静态空主(字符串步骤读取3源代码:
导入java.util.ArrayList。
导入Java . util . list;
导入Java . util . concurrent . *;
公共类CompletionServiceDemo {
公共静态void main(字符串[)参数引发中断异常,ExecutionException {
//创建线程池
ExecutorService线程池= Executors . NewFixedThreadPool(2);
//创建完成服务
完成服务=新的执行完成服务(线程池);
//保存执行结果的未来对象
列表& lt未来<。整数> 0。>。futures =新数组列表& lt>。();
//提交任务
futures . add(service . submit)(()->。getprice 1());
futures . add(service . submit)(()->。getprice 2());
//获得最快的返回任务执行结果
整数结果= 0;
尝试{
对于(int I = 0;i <。futures . size();i++) {
结果=(整数)服务。取()。get();
如果(结果!= null) {
休息;
}
}
}终于{
//取消所有任务
未来整数> 0。未来:未来)
未来。取消(真);
}
}
系统输出打印输入(结果);//只返回价格2
}
公共静态int getPrice1() {
尝试{
线程睡眠(200);
}捕获(中断例外e) {
e . PrintStackTrace();
}
返回1;
}
公共静态int getPrice2() {
尝试{
线程睡眠(100);
}捕获(中断例外e) {
e . PrintStackTrace();
}
返回2;
}
}
目标