我使用ExecutorService提交两个作业,如下所示。
final Future<String> futureResultA = executor.submit(jobA);
final Future<String> futureResultB = executor.submit(jobB);
现在,当我想从未来获得结果时,我正在调用get()方法来等待并获得结果。
futureResultA.get()
现在,如果我在每个工作中初始化一个锁存器并在锁存器上调用倒计时,那么使用CountDownLatch会给我带来什么好处吗?
答案 0 :(得分:0)
假设作业的结果彼此无关,答案是否定的(CountDownLatch不会添加任何值)
使用CompletionService会给你带来优势。目前,如果您先等待Job-A,那么该调用将阻塞,直到Job-A完成。只有这样,您才能继续检查Job-B的结果。因此,即使Job-B在作业A之前完成,您也无法使用其结果工具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());
}
答案 1 :(得分:0)
CountDownLatch有一个计数器字段,您可以根据需要减少它。然后我们可以用它来阻塞一个调用线程,直到它被计数到零。 在你的情况下,Future.get()已经服务于此目的,你不需要CountDownLatch。我宁愿说它会有点矫枉过正。