什么是Future
Future是一个未来对象,里面保存这线程处理结果,它像一个提货凭证,拿着它你可以随时去提取结果
什么时候使用
在两种情况下,离开Future几乎很难办。
- 一种情况是拆分订单,比如你的应用收到一个批量订单,此时如果要求最快的处理订单,那么需要并发处理,并发的结果如何收集,这个问题如果自己去编程将非常繁琐,此时可以使用CompletionService解决这个问题。CompletionService将Future收集到一个队列里,可以按结果处理完成的先后顺序进队。
- 另外一种情况是,如果你需要并发去查询一些东西(比如爬虫),并发查询只要有一个结果返回,你就认为查询到了,并且结束查询,这时也需要用CompletionService和Future来解决。
使用过程既可以用CompletionService,也可以自己维护一个list将Future添加进去。
区别是:CompletionService是先完成的先返回,自己维护的list就是按顺序一个个取值
示例代码:
public class FutureDemo {
private static class Task implements Callable<String> {
@Override
public String call() throws Exception {
// 模拟真实事务的处理过程,这个过程是非常耗时的。
Thread.sleep(5000);
return "call return " + Thread.currentThread().getName();
}
}
public static void main(String[] args) throws Exception {
FutureDemo demo =new FutureDemo();
demo.testComplete();
// demo.testFutrue();
}
private void testFutrue() throws Exception{
List<Future<String>> futures = new ArrayList<Future<String>>();
ExecutorService executorService = Executors.newCachedThreadPool();
System.out.println("已经提交资源申请");
for (int i = 0; i < 10; i++) {
futures.add(executorService.submit(new Task()));
}
for (Future<String> future : futures) {
if (!future.isDone()) {
System.out.println("资源还没有准备好");
}
System.out.println(future.get());
}
executorService.shutdown();
}
private void testComplete() throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
CompletionService<String> ecs = new ExecutorCompletionService<>(executorService);
System.out.println("已经提交资源申请");
int lenth =10;
for (int i = 0; i < lenth; i++) {
ecs.submit(new Task());
}
//CompletionService会按处理完后顺序返回结果
List<String> res =new ArrayList<>();
for(int i = 0;i<lenth;i++ ){
Future<String> f = ecs.take();
System.out.println(f.get());
}
executorService.shutdown();
}
}