码迷,mamicode.com
首页 > 其他好文 > 详细

ExecutorCompletionService原理详解

时间:2014-07-14 16:50:03      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   使用   2014   for   

    在JDK并发包中有这么一个类ExecutorCompletionService,提交任务后,可以按任务返回结果的先后顺序来获取各任务执行后的结果。

    该类实现了接口CompletionService:

public interface CompletionService<V> {
    
    Future<V> submit(Callable<V> task);

    Future<V> submit(Runnable task, V result);

    Future<V> take() throws InterruptedException;

    Future<V> poll();

    Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;

}

    该接口定义了一系列方法:提交实现了Callable或Runnable接口的任务,并获取这些任务的结果。

    ExecutorCompletionService实现了CompletionService,内部通过Executor以及BlockingQueue来实现接口提出的规范。其中,Executor由调用者传递进来,而Blocking可以使用默认的LinkedBlockingQueue,也可以由调用者传递。另外,该类还会将提交的任务封装成QueueingFuture,这样就可以实现FutureTask.done()方法,以便于在任务执行完毕后,将结果放入阻塞队列中。

    QueueingFuture为内部类:

private class QueueingFuture extends FutureTask<Void> {

        QueueingFuture(RunnableFuture<V> task) {

            super(task, null);

            this.task = task;

        }

        protected void done() { completionQueue.add(task); }

        private final Future<V> task;

    }

    其中,done()方法就是在任务执行完毕后,将任务放入队列中。

    在提交任务时,将任务封装成QueueingFuture:

public Future<V> submit(Callable<V> task) {

        if (task == null) throw new NullPointerException();

        RunnableFuture<V> f = newTaskFor(task);

        executor.execute(new QueueingFuture(f));

        return f;

    }

    在调用take()、poll()方法时,会从阻塞队列中获取Future对象,以取得任务执行的结果。



ExecutorCompletionService原理详解,布布扣,bubuko.com

ExecutorCompletionService原理详解

标签:style   blog   java   使用   2014   for   

原文地址:http://blog.csdn.net/ado1986/article/details/37758105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!