zoukankan      html  css  js  c++  java
  • Executor框架(六)CompletionService 接口

      CompletionService 接口是一个独立的接口,并没有扩展 ExecutorService 。 其默认实现类是ExecutorCompletionService;
      接口 CompletionService 的功能是:以异步的方式一边执行未完成的任务,一边记录、处理已完成任务的结果。从而可以将 任务的执行 与 处理任务的执行结果 分离开来。简单来说,CompletionService 就是监视着 Executor线程池执行的任务,用 BlockingQueue 将完成的任务的结果存储下来。(当然,这个也可以是程序员自己去实现,但是要不断遍历与每个任务关联的 Future,然后不断去轮询,判断任务是否已经完成,比较繁琐);

    构造方法摘要

    ExecutorCompletionService(Executor executor):
    指定一个Executor 来执行任务,存储完成的任务的完成队列是 LinkedBlockingQueue ;
    ExecutorCompletionService(Executor executor, BlockingQueue<Future> completionQueue)
    指定了任务执行器 Executor 和 已完成的任务队列 completionQueue

    方法摘要

    Future submit(Callable task):
    提交一个 Callable 任务;一旦完成,便可以由take()、poll()方法获取
    Future submit(Runnable task, V result):
    提交一个 Runnable 任务,并指定计算结果;
    Future take() throws InterruptedException
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
    Future poll()
    获取并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null。
    Future poll(long timeout, TimeUnit unit) throws InterruptedException
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则将等待指定的时间(如果有必要)。。

    @ Example
      下面的例子是这样一个场景:程序提交了多个任务,但只要有一个任务完成并返回一个非空的结果,并可以忽略掉其余的任务。

     void solve(Executor e, Collection<Callable<Result>> solvers) throws InterruptedException {
         CompletionService<Result> completionService = new ExecutorCompletionService<Result>(e);
         int n = solvers.size();
         List<Future<Result>> futures
             = new ArrayList<Future<Result>>(n);
         Result result = null;
         try {
             //提交多个任务
             for (Callable<Result> s : solvers)
                 futures.add(completionService.submit(s));
            //
             for (int i = 0; i < n; ++i) {
                 try {
                     //等待获取一个已经完成的任务
                     Result r = completionService.take().get();
                     //判断返回结果是否为空
                     if (r != null) {
                         result = r;
                         break;
                     }
                 } catch (ExecutionException ignore) {}
             }
         }
         finally {
             //取消所有任务
             for (Future<Result> f : futures)
                 f.cancel(true);
         }
    
         if (result != null)
             use(result);
     }
    
    
  • 相关阅读:
    Mvvm combobox绑定Dictionary问题
    类型转化方法(处理System.Nullable类型)
    linq 动态查询
    VS 2005 / 2008 / 2010 能否继续使用 ASP.NET 1.x版的DataGrid ????
    使用 Using...End Using区块来写程序,要非常小心!
    [习题]TreeView、Menu、SiteMapPath #2 多国语系 /当地语系 / Localization
    Repeater,不用自己写循环 (Loop)
    [习题]给初学者的范例,多重字段搜寻引擎 for GridView,兼论 SqlDataSource与SelectParameter的用法
    ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)「勘误表」、补充习题与档案下载
    Windows Vista / 7减少不必要的服务、最佳化(优化)
  • 原文地址:https://www.cnblogs.com/jinggod/p/8490440.html
Copyright © 2011-2022 走看看