• 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中(先执行完的先往里放),再从队列往外取的时候(队列先进先出)就自然达到了按执行快慢获取结果的效果。

  • 相关阅读:
    带箭头提示框
    文本溢出显示省略号
    Git高级操作
    sublime text 2 破解
    python如何画三维图像?
    pytorch梯度下降法讲解(非常详细)
    pytorch数学运算与统计属性入门(非常易懂)
    pytorch张量数据索引切片与维度变换操作大全(非常全)
    pytorch中tensor张量数据基础入门
    pytorch深度学习神经网络实现手写字体识别
  • 原文地址:https://www.cnblogs.com/silenceshining/p/15077638.html
Copyright © 2020-2023  润新知