学习CompletionService

CompletionService允许提交一系列Callable任务,并按照完成顺序返回结果。在示例程序中,创建了一个固定大小的线程池,提交了10个任务,每个任务睡眠的时间与其编号成反比。因此,编号9的任务最先完成,其结果最先从CompletionService中获取,依次是编号8至0的任务。这展示了CompletionService如何按任务完成的顺序返回结果。
摘要由CSDN通过智能技术生成
原文链接

https://blog.csdn.net/luzhouyue1024/article/details/128622978

可以向CompletionService提交一系列Callable并且返回值类型为T的任务,这个CompletionService会将他们的Future<T>加入一个队列,先执行完成的任务,先从结果队列中取出结果。符合“先完成先获取”的顺序规则。

下面用代码demo这个过程,示例程序对CompletionService提交了编号为0-9的10个Callable任务,编号0的任务,会休眠10秒再返回自身编号0;

编号1的会休眠9秒...

依次类推编号9的会休眠1秒再返回9。

猜一猜,哪个任务会先从CompletionService里返回结果呢?

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的结果,因为它运行的时长最短,然后依次取到编号8,编号7......的结果,顺序是遵循运行时间从短到长的结果

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值