[英]Does it make sense to use a Future<T> with a CountDownLatch?
我正在使用ExecutorService提交两个作业,如下所示。
final Future<String> futureResultA = executor.submit(jobA);
final Future<String> futureResultB = executor.submit(jobB);
现在,当我想从将来获得结果时,我正在调用get()方法等待并获得结果。
futureResultA.get()
现在,如果我初始化一个闩锁并在每个作业中调用该闩锁的倒计时,使用CountDownLatch会给我带来任何好处吗?
假设作业的结果彼此无关,答案为“否”(CountDownLatch将不添加任何值)
使用CompletionService会给您带来好处。 当前,如果您首先等待Job-A,则该调用将阻塞,直到Job-A完成。 只有这样,您才能继续检查Job-B的结果。 因此,即使Job-B在job-A之前完成,您也无法使用它的结果util Job-A也已经完成。
使用CompletionService,您可以从任何先完成的工作中获取结果,然后使用它们而无需等待其他任务-
public static void main(String[] args) throws Exception {
Callable<String> jobA = () -> {
Thread.sleep(2000);
return "JobA's result";
};
Callable<String> jobB = () -> {
Thread.sleep(1000);
return "JobB's result";
};
Executor executor = Executors.newFixedThreadPool(2);
CompletionService<String> completionService = new ExecutorCompletionService<>(executor);
completionService.submit(jobA);
completionService.submit(jobB);
Future<String> futureWhichCompletedFirst = completionService.take();
System.out.println(futureWhichCompletedFirst.get());
Future<String> futureWhichCompletedNext = completionService.take();
System.out.println(futureWhichCompletedNext.get());
}
CountDownLatch有一个计数器字段,正如我们要求您可以递减。 然后,我们可以用它来阻止调用线程,直到它被倒计数至零。 因为在您的情况下Future.get()已经用于此目的,所以您不需要CountDownLatch。 我宁愿说那会太过分了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.