Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待任何已完成的可调用返回值在可调用列表中完成后立即返回_Java_Multithreading_Future_Executorservice - Fatal编程技术网

Java 等待任何已完成的可调用返回值在可调用列表中完成后立即返回

Java 等待任何已完成的可调用返回值在可调用列表中完成后立即返回,java,multithreading,future,executorservice,Java,Multithreading,Future,Executorservice,TL;DR:我希望能够等待所有的期货,但一旦完成,就可以得到每个可赎回股票的回报值 假设我使用一个执行器运行多个callable。 如果我有一个未来列表,有没有什么优雅的方法可以获得任何已完成任务的回报值,然后继续以同样的方式等待任务的其余部分?这就是目的所在 Executor Executor=。。。; 列表任务=列表中的(…); CompletionService CompletionService=新的执行者CompletionService(执行者); tasks.forEach(com

TL;DR:我希望能够等待所有的期货,但一旦完成,就可以得到每个可赎回股票的回报值

假设我使用一个执行器运行多个callable。 如果我有一个未来列表,有没有什么优雅的方法可以获得任何已完成任务的回报值,然后继续以同样的方式等待任务的其余部分?

这就是目的所在

Executor Executor=。。。;
列表任务=列表中的(…);
CompletionService CompletionService=新的执行者CompletionService(执行者);
tasks.forEach(completionService::submit);
对于(int i=0;i
当您还在等待时,您会如何处理在最后一个任务之前完成的任务?你能添加一个例子吗?@ernest_k我只是将结果转发给下一个处理线程。用一个方法包装可调用对象,该方法接受结果并放入阻塞队列。让主线程读取队列。
Executor executor = ...;
List<Callable<T>> tasks = List.of(...);
CompletionService<T> completionService = new ExecutorCompletionService<>(executor);
tasks.forEach(completionService::submit);
for (int i = 0; i < tasks.size(); i++) {
    T result = completionService.take().get();
    // A task has completed. Use its result.
}