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