学习CompletionService

可以向CompletionService提交一系列Callable并且返回值类型为T的任务,这个completionService会将他们的Future<T>加入一个队列,然后先执行完成的能先从结果队列中取出结果。

示例程序对CompletionService提交了编号为0-9的10个Callable任务,然后编号0的会休眠10秒再返回自身编号0,编号1的会休眠9秒...依次类推编号9的会休眠1秒再返回9。

package lydia.study.concurrent;

import java.util.concurrent.*;
//CompletionService使用
public class CompletionServiceTest {


    public static void main(String[] args) {
        int POOL_SIZE = 10;
        ExecutorService executor = Executors.newFixedThreadPool(POOL_SIZE);
        CompletionService<Integer> service = new ExecutorCompletionService<>(executor);
        for (int i = 0; i < POOL_SIZE; i++) {
            int threadId = i;
            service.submit( () ->{
                    Thread.sleep((10 - threadId) * 1000);
                    return threadId;
                }
            );
        }
        for (int i = 0; i < POOL_SIZE; i++) {
            try {
                Future<Integer> result = service.take();
                System.out.println("In loop, i=" + i + ", thread id=" + result.get());
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } catch (ExecutionException e) {
                System.out.println(e.getCause());
            }
        }
        executor.shutdown();
    }

}

调用CompletionService的take()方法,则会先取到编号9的结果,因为它运行的时长最短,然后依次取到运行时间从短到长的结果

In loop, i=0, thread id=9
In loop, i=1, thread id=8
In loop, i=2, thread id=7
In loop, i=3, thread id=6
In loop, i=4, thread id=5
In loop, i=5, thread id=4
In loop, i=6, thread id=3
In loop, i=7, thread id=2
In loop, i=8, thread id=1
In loop, i=9, thread id=0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值