返回介绍

java.util.concurrent 类 ExecutorCompletionService<V>

发布于 2019-10-04 09:51:43 字数 8182 浏览 961 评论 0 收藏 0

java.lang.Object
  └java.util.concurrent.ExecutorCompletionService<V>
所有已实现的接口:
CompletionService<V>

public class ExecutorCompletionService<V>
extends Object
 
implements CompletionService<V>
 

使用提供的 Executor 来执行任务的 CompletionService 。此类将安排那些完成时提交的任务,把它们放置在可使用 take 访问的队列上。该类非常轻便,适合于在执行几组任务时临时使用。

用法示例。

假定您有针对某个问题的一组求解程序,每个求解程序都能返回某种类型的 Result 值,并且您想同时运行它们,使用方法 use(Result r) 处理返回非 null 值的每个求解程序的返回结果。可以这样编写程序:

    void solve(Executor e, Collection<Callable<Result>> solvers)
      throws InterruptedException, ExecutionException {
        CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
        for (Callable<Result> 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<Callable<Result>> solvers) 
      throws InterruptedException {
        CompletionService<Result> ecs = 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(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<Result> f : futures)
                f.cancel(true);
        }

        if (result != null)
            use(result);
    }

构造方法摘要
ExecutorCompletionService(Executorexecutor)

使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将 LinkedBlockingQueue 作为完成队列。

ExecutorCompletionService(Executorexecutor, BlockingQueue<Future<V>>completionQueue)

使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将所提供的队列作为其完成队列。

方法摘要
Future<V>poll()

检索并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null

Future<V>poll(longtimeout, TimeUnitunit)

检索并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则将等待指定的时间(如果有必要)。

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

提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。

Future<V>submit(Runnabletask, Vresult)

提交要执行的 Runnable 任务,并返回一个表示任务完成的 Future,可以提取或轮询此任务。

Future<V>take()

检索并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。

从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

构造方法详细信息

ExecutorCompletionService

public ExecutorCompletionService(Executorexecutor)
使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将 LinkedBlockingQueue 作为完成队列。
参数:
executor - 要使用的执行程序
抛出:
NullPointerException - 如果执行程序为 null

ExecutorCompletionService

public ExecutorCompletionService(Executorexecutor,
                                 BlockingQueue<Future<V>>completionQueue)
使用为执行基本任务而提供的执行程序创建一个 ExecutorCompletionService,并将所提供的队列作为其完成队列。
参数:
executor - 要使用的执行程序
completionQueue - 用作完成队列的队列,通常是专供此服务使用的队列
抛出:
NullPointerException - 如果执行程序或 completionQueue 为 null

方法详细信息

submit

public Future<V> submit(Callable<V>task)
从接口 CompletionService 复制的描述
提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。在完成时,可能会提取或轮询此任务。
指定者:
接口 CompletionService<V> 中的 submit
参数:
task - 要提交的任务
返回:
一个表示挂起的任务完成的 Future

submit

public Future<V> submit(Runnabletask,
                        Vresult)
从接口 CompletionService 复制的描述
提交要执行的 Runnable 任务,并返回一个表示任务完成的 Future,可以提取或轮询此任务。
指定者:
接口 CompletionService<V> 中的 submit
参数:
task - 要提交的任务
result - 要返回的已成功完成任务的结果
返回:
一个表示挂起的任务完成的 Future,其 get() 方法将返回完成时给出的结果值

take

public Future<V> take()
               throws InterruptedException
从接口 CompletionService 复制的描述
检索并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
指定者:
接口 CompletionService<V> 中的 take
返回:
表示下一个已完成任务的 Future
抛出:
InterruptedException - 如果在等待时被中断。

poll

public Future<V> poll()
从接口 CompletionService 复制的描述
检索并移除表示下一个已完成任务的 Future,如果不存在这样的任务,则返回 null
指定者:
接口 CompletionService<V> 中的 poll
返回:
表示下一个已完成任务的 Future;如果不存在这样的任务,则返回 null

poll

public Future<V> poll(longtimeout,
                      TimeUnitunit)
               throws InterruptedException
从接口 CompletionService 复制的描述
检索并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则将等待指定的时间(如果有必要)。
指定者:
接口 CompletionService<V> 中的 poll
参数:
timeout - 放弃之前需要等待的时间长度,以 unit 为时间单位
unit - 确定如何解释 timeout 参数的 TimeUnit
返回:
表示下一个已完成任务的 Future;如果等待了指定时间仍然不存在这样的任务,则返回 null
抛出:
InterruptedException - 如果在等待时被中断。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文