java completable future 中的 supplyAsync 线程在不同的环境中使用不同的线程

Thread of supplyAsync in java completable future uses different threads in different environments

在我的 webapp supplyAsync 方法中,在云 linux 环境中使用 forkjoin 池,但在本地 linux 机器中,相同的代码使用线程,例如 thread-1 thread-2 和 class 网络应用 class装载机。是否有任何配置可以更改默认线程池以完成 futures.I 想要获得云中的本地行为。使用网络应用 class 加载程序的线程。 java 版本 java 11,tomcat 版本 8.5.24.

CompletableFuture<Void> asyncFuture = future.thenAcceptAsync(t -> {
        if (!complete.getAndSet(true)) {
            try {
                completeAction.accept(t);
            } finally {
                synchronized (executor) {
                    K.shutdown();
                }
            }
        }
    });
    synchronized (executor) {
        if (!executor.isShutdown()) {
            executor.schedule(() -> {
                if (!complete.getAndSet(true)) {
                    try {
                        asyncFuture.cancel(false);
                        timeoutAction.run();
                    } finally {
                        executor.shutdown();
                    }
                }
            }, 200, 50);
        }
    }

CompletableFuture 每个任务使用一个新线程还是 ForkJoinPool 取决于您系统的并行级别:

All async methods without an explicit Executor argument are performed using the ForkJoinPool.commonPool() (unless it does not support a parallelism level of at least two, in which case, a new Thread is created to run each task).

(比照Javadoc)。

默认并行级别比处理器数量少一个,但您可以将其更改为设置系统的任何值属性 java.util.concurrent.ForkJoinPool.common.parallelism(参见ForkJoinPool)。

不过,我宁愿使用自定义的 Executor,就像对此评论和您的 previous question 的评论一样。事实上,新创建的线程继承了当前线程上下文 class 加载器,而公共池没有,应该更多地被视为一个实现细节。您的代码在这两种情况下都应该可以正常工作。