Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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 具有超时的未来get与具有超时的CompletionService轮询的性能差异_Java_Multithreading_Concurrency_Java.util.concurrent_Completion Service - Fatal编程技术网

Java 具有超时的未来get与具有超时的CompletionService轮询的性能差异

Java 具有超时的未来get与具有超时的CompletionService轮询的性能差异,java,multithreading,concurrency,java.util.concurrent,completion-service,Java,Multithreading,Concurrency,Java.util.concurrent,Completion Service,假设我有一个长时间运行的操作,如果需要的时间太长,我希望从中获得结果或超时 我想比较两种不同的版本: 1) 当我们调用poll时,我们会检查是否有任何项目进入了内部阻塞队列 ExecutorService executorService = Executors.newFixedThreadPool(4); CompletionService<String> completionService = new ExecutorCompletionService<>(execut

假设我有一个长时间运行的操作,如果需要的时间太长,我希望从中获得结果或超时

我想比较两种不同的版本:

1) 当我们调用
poll
时,我们会检查是否有任何项目进入了内部阻塞队列

ExecutorService executorService = Executors.newFixedThreadPool(4);
CompletionService<String> completionService = new ExecutorCompletionService<>(executorService);

Future<String> future = completionService.submit(() -> {...});
final Future<String> result = completionService.poll(30, TimeUnit.SECONDS);
if (result != null) {
   ...
}

基本上,在这两个版本中,我们都在等待将来完成它的执行,但是内部实现是不同的。在表现方面会有什么不同吗?我看到了这个答案,它将
CompletionService
CompletableFuture
进行了比较,并说应该有。
FutureTask
实现是否也一样?如果是,最好能听到更好的解释。

你应该忘记这个答案,这是胡说八道。这些并发API的等待例程是由同一位专家开发的,不会有显著差异。无论您是等待
未来任务
,还是等待
阻塞队列
,都没有相关区别。因此,第二个示例更简单,省略了
阻塞队列的创建和使用。唯一更有效的方法是根本不等待,例如,
CompletableFuture.supplyAsync(()->{…},executorService)。然后接受(result->{…})将在结果可用后执行使用者,因此没有线程等待。好的,很酷,这很有意义。谢谢
ExecutorService executorService = Executors.newFixedThreadPool(4);
Future<String> future = executorService.submit(() -> {...});
try {
   String result = future.get(30, TimeUnit.SECONDS);
} catch (TimeoutException e) {
   ...
}