将快速线程交还给池,而不是等待慢线程

时间:2018-10-27 16:34:40

标签: java multithreading completable-future

我们有两个单独的任务,我们并行运行这些任务,然后合并它们的结果。下面的代码段相同。有时task1需要更多时间,而task2需要更多时间。如您在合并功能中首先看到的,我们得到task1的结果,而不是task2。当task1需要更多时间时,甚至task2线程仍处于繁忙状态。有没有一种方法可以使该任务完成后立即释放线程,而与其他任务状态无关。

CompletableFuture<List<?>> task1 = CompletableFuture.supplyAsync(
                () -> task1(), threadPoolTaskExecutor);

        CompletableFuture<List<?>> task2 = CompletableFuture.supplyAsync(
                () -> task2(), threadPoolTaskExecutor);

        final CompletableFuture<List<?>> tasks = CompletableFuture.allOf(task1, task2).thenApply(
                ignore -> Stream.of(task1, task2).map(cf -> cf.join()).collect(Collectors.toList()));

        // merge two data
        merge((List<DistributorZipCmTntZone>) tasks.join().get(0),
                        (List<DistributorZipCmTntZone>) tasks.join().get(1));

1 个答案:

答案 0 :(得分:0)

使用ExecutorCompletionService。它实现了一个队列,该队列在完成任务时接收任务。在您这一边,您编写myCompletionService.take()。get()并在完成任务时收到任务。