首页 > 其他 > 详细

使用CompletionService结合ExecutorService批处理任务

时间:2015-12-08 23:47:50      阅读:192      评论:0      收藏:0      [点我收藏+]
CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果。为此你可以将每个任务的Future保存进一个集合,然后循环这个集合调用Future的get()取出数据。幸运的是CompletionService帮你做了这件事情。
CompletionService整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take和poll方法,在结果完整可用时获得这个结果,像一个打包的Future。
CompletionService的take返回的future是哪个先完成就先返回哪一个,而不是根据提交顺序。
 
例子:
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class CallableAndFuture {
 
        public static void main(String[] args) {
              ExecutorService threadPool = Executors. newFixedThreadPool(10);
              CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool);
 
               for (int i = 0; i < 10; i++) {
                      final int seq = i;
                     System. out.println("开始提交第" + seq + "个任务");
                     completionService.submit( new Callable<Integer>() {
 
                            @Override
                            public Integer call() throws Exception {
                                  Thread. sleep(new Random().nextInt(5000));
                                   return seq;
                           }
                     });
              }
 
               for (int i = 0; i < 10; i++) {
                      try {
                            // 取出并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
                           Integer seq = completionService.take().get();
                           System. out.println("第" + seq + "个任务返回");
                     } catch (InterruptedException e) {
                           e.printStackTrace();
                     } catch (ExecutionException e) {
                           e.printStackTrace();
                     }
              }
       }
 
}

使用CompletionService结合ExecutorService批处理任务

原文:http://www.cnblogs.com/tstd/p/5031334.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!