gpt4 book ai didi

multithreading - 来自池的 CompletableFuture 重用线程

转载 作者:行者123 更新时间:2023-12-03 12:55:01 25 4
gpt4 key购买 nike

我正在测试 Completable Future。
如所述here
我认为线程会从公共(public)池中重用,但这个片段显示了奇怪的行为

for (int i = 0; i < 10000; i++) {
final int counter = i;
CompletableFuture.supplyAsync(() -> {

System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
});
}

我有这样的输出:
Looking up 0 on thread Thread-2
Looking up 1 on thread Thread-3
Looking up 2 on thread Thread-4
...
Looking up 10000 on thread Thread-10002

似乎为每个任务创建了一个新线程。
为什么我所有的 completableFuture 都不重用公共(public)池中的线程?

此外,我已经使用 RxJava 进行了测试,它可以按照以下代码的预期工作:
for (int i = 0; i < 10000; i++) {
rxJobExecute(i).subscribeOn(Schedulers.io()).subscribe();
}

private Observable<String> rxJobExecute(int i) {
return Observable.fromCallable(() -> {

System.out.println("emission " + i + " on thread " + Thread.currentThread().getName());
return "tata";

});
}

输出
emission 8212 on thread RxIoScheduler-120
emission 8214 on thread RxIoScheduler-120
emission 8216 on thread RxIoScheduler-120
emission 8218 on thread RxIoScheduler-120
emission 8220 on thread RxIoScheduler-120
emission 7983 on thread RxIoScheduler-275
emission 1954 on thread RxIoScheduler-261
emission 1833 on thread RxIoScheduler-449
emission 1890 on thread RxIoScheduler-227

最佳答案

很有可能因为您只有 2 个处理器,所以值 Runtime.getRuntime().availableProcessors()仅在应用程序启动时观察到 1处理器(avialableProcessors 将返回介于 1 和您机器上的处理器数量之间的任何数字,并且不是很确定)。

如果并行度为 1,ForkJoin 公共(public)池将使用每任务线程池。

要强制系统以特定的并行度加载(至少为此),请定义系统属性 -Djava.util.concurrent.ForkJoinPool.common.parallelism=2作为运行时参数

编辑:

我再次查看了内部逻辑。既然你有 2核心,并行性将始终使用每个任务的线程。逻辑要求大于或等于 3,因此您需要将并行度更新为 3
-Djava.util.concurrent.ForkJoinPool.common.parallelism=3 .

另一种方法是定义自己的 ThreadPool

关于multithreading - 来自池的 CompletableFuture 重用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39165655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com