zoukankan      html  css  js  c++  java
  • CompletionService的应用场景

    如下场景:我们在一个线程池中提交了多个任务,多个任务的执行时长不一样,而且我们想按执行时间的长短(先拿到执行时间短的任务的结果,再拿执行时间长的任务的结果)来依次获取任务的返回结果。

    那可以应用CompletionService来方便的处理这个场景。

    示例代码如下:

    package completionServiceDemo;
    
    import java.util.Date;
    import java.util.concurrent.*;
    
    public class Demo {
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            ExecutorService executorService = Executors.newFixedThreadPool(5);
            CompletionService<Integer> completionService = new ExecutorCompletionService<>(executorService);
            completionService.submit(new MyCallable(10));
            completionService.submit(new MyCallable(20));
            completionService.submit(new MyCallable(5));
            for (int i = 0; i < 3; i++) {
                Integer integer = completionService.take().get();
                System.out.println(new Date() + ":" + integer);
            }
        }
    }
    package completionServiceDemo;
    
    import java.util.concurrent.Callable;
    
    public class MyCallable implements Callable<Integer> {
    
        Integer seconds;
    
        public MyCallable(int seconds) {
            this.seconds = seconds;
        }
    
        @Override
        public Integer call() throws Exception {
            Thread.sleep(seconds * 1000);
            return seconds;
        }
    }

    打印结果如下:

    Thu Jul 29 23:26:55 CST 2021:5
    Thu Jul 29 23:27:00 CST 2021:10
    Thu Jul 29 23:27:10 CST 2021:20

    原理:

    CompletionService将各任务执行的结果放到一个BlockingQueue中(先执行完的先往里放),再从队列往外取的时候(队列先进先出)就自然达到了按执行快慢获取结果的效果。

  • 相关阅读:
    更新user的方法
    django里的http协议
    django的第一个问题
    一台机器上配置多个ip地址;访问宿主机上的容器
    virtio 之后的数据直连
    virtio是啥子
    perf的采样模式和统计模式
    perf的统计模式: 突破口: x86_perf_event_update
    arp_filter的验证,使用net namespace
    阿里云Windows 2008一键安装包配置php web环境图文安装教程(IIS+Php+Mysql)
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15077638.html
Copyright © 2011-2022 走看看