【Java并发】- 使用CompletionService异步收集任务结果

本文介绍了在Java并发编程中如何利用CompletionService来高效地收集并处理异步任务的结果,包括顺序获取结果、轮询方式以及CompletionService的工作原理和使用示例。
摘要由CSDN通过智能技术生成

概述

在使用Executor或者直接使用ExecutorService的时候,通常会提交很多个任务同时还需要等待任务的返回结果,这个时候如何快速的回收任务的结果就成了问题。
而使用CompletionService可以生产新的异步任务与使用已完成任务的结果分离开来。比如前端页面的图片这种IO的任务,我们并不关心图片的顺序,只是希望能尽快的将图片展示出来。这个时候如果只是顺序的去取图片结果的话,那么很可能顺序排在后面的图片其实很小但是却很晚才能显示出来。

使用

由一个简单的发送消息的Demo来演示

顺序的取任务结果

使用一个List去记录submit返回的future,然后顺序的取回结果
一共执行10个任务messageId从0~10
messageId % 4 == 0的任务的执行时间会比其他任务长很多

public class SendMessageDemo {

	//线程池中核心线程数
	private final static int THREAD_POOL_SIZE = 3;
	
	private static final int MAX_THREAD_POOL_SIZE = 5;
	
	public static void main(String[] args){
		
		test1();
		
	}
	
	public static void test1() {
		//任务阻塞队列
		BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);
		ThreadPoolExecutor excutor = new ThreadPoolExecutor(THREAD_POOL_SIZE, MAX_THREAD_POOL_SIZE, 0, TimeUnit.MILLISECONDS, workQueue);
		
		List<Future<Integer>> list = new ArrayList<>();
		
		for(int i = 0; i < 10; i++){
			//将任务提交到阻塞队列
			Future<Integer> future = excutor.submit(new MessageTask(i));
			l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值