ExecutorCompletionService

                java.util.concurrent
类 ExecutorCompletionService<V>
java.lang.Object
  继承者 java.util.concurrent.ExecutorCompletionService<V>
所有已实现的接口:
    CompletionService<V> 
    它实现了CompletionService接口,它使用在构造函数中提供的Executor来执行任务的。它会把完成了的任务放一个队列中, 外部可以通过take(),poll(),poll(long timeout,TimeUnit unit)来取得。该类非常轻便,适合于在执行几组任务时临时使用。
用法示例。 假定您有针对某个问题的一组求解程序,每个求解程序都能返回某种类型的 Result 值,
并且您想同时运行它们,使用方法 use(Result r) 处理返回非 null 值的每个求解程序的返回结果。
可以这样编写程序:
 void solve(Executor e,
            Collection> solvers)
     throws InterruptedException, ExecutionException {
     CompletionService ecs
         = new ExecutorCompletionService(e);
     for (Callable s : solvers)
         ecs.submit(s);
     int n = solvers.size();
     for (int i = 0; i < n; ++i) {
         Result r = ecs.take().get();
         if (r != null)
             use(r);
     

 }}
假定您想使用任务集中的第一个非 null 结果,而忽略任何遇到异常的任务,并且在 第一个任务完成时取消其他所有任务:
void solve(Executor e,
            Collection> solvers)
     throws InterruptedException {
     CompletionService ecs
         = new ExecutorCompletionService(e);
     int n = solvers.size();
     List> futures
         = new ArrayList>(n);
     Result result = null;
     try {
         for (Callable s : solvers)
             futures.add(ecs.submit(s));
         for (int i = 0; i < n; ++i) {
             try {
                 Result r = ecs.take().get();
                 if (r != null) {
                     result = r;
                     break;
                 

             } catch (ExecutionException ignore) {}
         }
     }
     finally {
         for (Future f : futures)
             f.cancel(true);
     }

     if (result != null)
         use(result);
 }}
主要构造函数
public  ExecutorCompletionService(Executor executor)
    使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将 LinkedBlockingQueue 作为完成队列。
    参数:
        executor - 要使用的执行程序 
    抛出:
        NullPointerException - 如果执行程序为 null
public  ExecutorCompletionService(Executor executor,BlockingQueue<Future<V>> completionQueue)
    使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将所提供的队列作为其完成队列。
    参数:
        executor - 要使用的执行程序
        completionQueue - 用作完成队列的队列,通常是专供此服务使用的队列 
    抛出:
        NullPointerException - 如果执行程序或 completionQueue 为 null
主要成员函数
public Future<V>  submit(Callable<V> task)
    从接口 CompletionService 复制的描述
    提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。在完成时,可能会提取或轮询此任务。
    指定者:
        接口 CompletionService<V> 中的 submit
    参数:
        task - 要提交的任务 
    返回:
        一个表示挂起的任务完成的 Future
public Future<V>  submit(Runnable task,V result)
    从接口 CompletionService 复制的描述
    提交要执行的 Runnable 任务,并返回一个表示任务完成的 Future,可以提取或轮询此任务。
    指定者:
        接口 CompletionService<V> 中的 submit
    参数:
        task - 要提交的任务
        result - 要返回的已成功完成任务的结果 
    返回:
        一个表示挂起的任务完成的 Future,其 get() 方法将返回完成时给出的结果值
public Future<V>  take()
               throws InterruptedException
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
    指定者:
        接口 CompletionService<V> 中的 take
    返回:
        表示下一个已完成任务的 Future 
    抛出:
        InterruptedException - 如果在等待时被中断
public Future<V>  poll()
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null。
    指定者:
        接口 CompletionService<V> 中的 poll
    返回:
        表示下一个已完成任务的 Future;如果不存在这样的任务,则返回 null
public Future<V>   poll(long timeout,
                      TimeUnit unit)
               throws InterruptedException
    从接口 CompletionService 复制的描述
    获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则将等待指定的时间(如果有必要)。
    指定者:
        接口 CompletionService<V> 中的 poll
    参数:
        timeout - 放弃之前需要等待的时间长度,以 unit 为时间单位
        unit - 确定如何解释 timeout 参数的 TimeUnit 
    返回:
        表示下一个已完成任务的 Future;如果等待了指定时间仍然不存在这样的任务,则返回 null 
    抛出:
        InterruptedException - 如果在等待时被中断
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值