【问题标题】:ThreadPoolExecutor, Futures: correlating requests and responsesThreadPoolExecutor,Futures:关联请求和响应
【发布时间】:2017-01-28 22:04:19
【问题描述】:

我正在尝试将ThreadPoolExecutorFuture(结果)和Callable(要执行的任务)一起使用,但我无法找到一种将输入(可调用)与相应的结果(Future),似乎唯一明智的方法是创建一个包含所有项目的包装器(example),但这对于如此简单的任务来说可能开销太大。

我错了吗?有什么建议的替代品吗?

【问题讨论】:

    标签: java multithreading threadpool future threadpoolexecutor


    【解决方案1】:

    更好的方法是使用invokeAll() 方法而不是submit()。您需要向它提供Callables 的集合,它将以与您的任务相同的顺序返回Futures 的集合。此外,invokeAll() 允许您定义超时,因此您不需要闩锁。会是这样的:

    List<Callable> jobs = new ArrayList<>(requests.size());
    for (String request : requests) {
        jobs.add(new MyCallable(request));
    }
    List<Future<ProcessedResponse>> futures = executor.invokeAll(jobs, timeout, TimeUnit.MILLISECONDS);
    Iterator<String> it = requests.iterator();
    for (Future<ProcessedResponse> future: futures) {
        String request = it.next();  // This request corresponds to this future
        if (future.isDone()) {
            results.add(new Result(request, future.get()));
        } else {
            future.cancel(true);
        }
    }
    

    【讨论】:

    • 听起来不错,但我唯一担心的是集合的顺序,我需要一个特定的集合类还是任何可以做的? “保留订单”的具体说明在哪里?
    • 所有Lists 都保留元素顺序。因此,您需要将一个列表传递给执行者,它会返回一个期货列表。这是invokeAll() 方法的文档,请查看“返回”部分:docs.oracle.com/javase/8/docs/api/java/util/concurrent/…
    • 只是一个小错字:局部循环变量应该是单数而不是复数,即“future”,因为“futures”已经是整个列表。哎呀:它也读为“fugure.get()”,而不是“future.get()”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-03-08
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多