ExecutorCompletionService的使用方法

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class Test {

    static class Call implements Callable<String> {
        String name;
        public Call(String name) {
            this.name = name;
        }
        @Override
        public String call() throws Exception {
            if (name.equals("5"))
                Thread.sleep(5000);
            Thread.sleep(1000);
            System.out.println(name + "over");
            return name;
        }
    }

    public static void main(String[] args) throws Exception {
        ExecutorCompletionService<String> pool = new ExecutorCompletionService<String>(
                Executors.newFixedThreadPool(5));
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++)
            pool.submit(new Call(i + ""));
        for (int i = 0; i < 10; i++) {
            Future<String> f = pool.poll(2000, TimeUnit.MILLISECONDS);//poll函数无参数则不等待,有完成结果则返回结果,无完成结果则返回null
            if (null != f) {
                String res = f.get();
                list.add(res);
            } else
                System.out.println(i + "null");
        }
        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i));

    }

}

执行结果:

2over
1over
3over
0over
4over
6over
7over
8over
9over
9null
2
1
3
0
4
6
7
8
9
5over

时间: 2024-08-01 17:00:16

ExecutorCompletionService的使用方法的相关文章

Future 和 ExecutorCompletionService 对比和使用

附加:Java 4种线程池介绍请查看 谈谈new Thread的弊端及Java四种线程池的使用 当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成.如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那么在调用get方式时,需要将超时时间设置为0 public class Completi

JDK并发工具包CompletionService和ExecutorCompletionService的好处和使用场景

<Java并发编程实践>一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话: "如果向Executor提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务关联的Future,然后反复使用get方法,同时将参数timeout指定为0,从而通过轮询来判断任务是否完成.这种方法虽然可行,但却有些繁琐.幸运的是,还有一种更好的方法:完成服务CompletionService." 这是什么意思呢?我们通过

【Java多线程】ExecutorService与ExecutorCompletionService

ExecutorService与ExecutorCompletionService都是java.util.concurrent包的并发处理类,总的来说,ExecutorCompletionService是ExecutorService的功能增强版,ExecutorCompletionService以BlockingQueue<Future<V>>来存放已经完成的任务. 也就是说,优先完成的任务会优先存放在BlockingQueue<Future<V>>队列中

ExecutorCompletionService原理详解

在JDK并发包中有这么一个类ExecutorCompletionService,提交任务后,可以按任务返回结果的先后顺序来获取各任务执行后的结果. 该类实现了接口CompletionService: public interface CompletionService<V> { Future<V> submit(Callable<V> task); Future<V> submit(Runnable task, V result); Future<V&

获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成.如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那么在调用get方式时,需要将超时时间设置为0 Java代码 public class CompletionServiceTest { static class Task impleme

ExecutorCompletionService分析及使用

当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成.如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那么在调用get方式时,需要将超时时间设置为0 1 public class ExecutorCompletionServiceTest { 2 3 static class Task

CompletionService和ExecutorCompletionService

CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象. 如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果.为此你可以将每个任务的Future保存进一个集合,然后循环这个集合调用Future的get()取出数据.幸运的是CompletionService帮你做了这件事情. CompletionService整合了Executor和BlockingQueue的功能.你可以将Callabl

Unity 崩溃问题解决方法——之一

友情提示:工作随记,不喜勿喷 注意:文艺青年可以略过,暴力青年欢迎采纳 Library文件夹 Unity每次编译都会生成这个东西,不用担心丢失的问题.所以,干掉他! 选中 + Delete   或者  选中 + Shift  + Delete 网上看了很多方法,就觉得这个简单,粗暴,是我喜欢的类型. 优点:上面说了 缺点:如果工程过大,重新编译时间会比较长.(但是对于查Log日志来说,相对快点)

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安