多线程之Future使用详解

什么是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();
    }
}

猜你喜欢

转载自blog.csdn.net/wlddhj/article/details/84342863
今日推荐