繁体   English   中英

使用Future是否有意义 <T> 与CountDownLatch?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM