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 加载器,而公共池没有,应该更多地被视为一个实现细节。您的代码在这两种情况下都应该可以正常工作。
在我的 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 加载器,而公共池没有,应该更多地被视为一个实现细节。您的代码在这两种情况下都应该可以正常工作。