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

Giving back fast thread to pool instead of waiting for slow thread

我们有两个单独的任务,我们 运行 并行处理它们,然后合并它们的结果。下面的代码片段相同。有时 task1 需要更多时间,有些 task2 需要更多时间。正如您首先在合并函数中看到的那样,我们得到的是任务 1 结果,而不是任务 2。当 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));

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