其他分享
首页 > 其他分享> > CompletionService 接口

CompletionService 接口

作者:互联网

使用线程池的时候,经常会有需要获得线程处理结果的时候。此时我们通常有两种做法:

1. 使用并发容器将callable.call() 的返回Future存储起来。然后使用一个消费者线程去遍历这个并发容器,调用Future.isDone()去判断各个任务是否处理完毕。然后再处理响应的业务。

2. 使用jdk 自带线程池结果管理器:ExecutorCompletionService。它将BlockingQueue 和Executor 封装起来。然后使用ExecutorCompletionService.submit()方法提交任务。

示例1:

package com.transsnet.palmpay.cfront.test;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;

public class ExecutorResultManager {

    public static void main(String[] args) {
        // 队列
        BlockingQueue<Future<String>> futures = new LinkedBlockingQueue<>();
        
        // 生产者
        new Thread() {
            @Override
            public void run() {
                ExecutorService pool = Executors.newCachedThreadPool();
                
                for (int i=0; i< 10; i++) {
                    int index = i;
                    Future<String> submit = pool.submit(new Callable<String>() {
                        @Override
                        public String call() throws Exception {
                            return "task done" + index;
                        }
                    });
                    try {
                        futures.put(submit);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        
        
        System.out.println("---------------------");
        System.out.println(futures.size());
        // 消费者
        new Thread() {
            @Override
            public void run() {
                while(true) {
                    Future<String> future = futures.poll();
                    if(future != null && future.isDone()) {
                        // 处理业务
                        try {
                            System.out.println("消費者" + future.get());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
    }

}

结果:

---------------------
0
消費者task done0
消費者task done1
消費者task done2
消費者task done3
消費者task done4
消費者task done5
消費者task done6
消費者task done7
消費者task done8
消費者task done9

 

标签:task,java,CompletionService,接口,消費者,util,concurrent,import
来源: https://www.cnblogs.com/duanxz/p/14617990.html