概述
在使用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