gpt4 book ai didi

java - 在 ForkJoinpool 上使用 CompletableFuture 并避免线程等待

转载 作者:行者123 更新时间:2023-11-30 06:52:17 25 4
gpt4 key购买 nike

你好,我认为使用 CompletableFuture 和默认的 ForkJoinPool 我可以比经典的 ExecutorService 更优化任务的执行,但我遗漏了一些东西

使用这段代码执行需要 1 秒,我有 3 个工作线程:

for (int i = 0; i < 3; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}

好的,看起来很正常。

但是使用这段代码,需要 3 秒:

for (int i = 0; i < 9; i++) {
final int counter = i;
listTasks.add(CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000);
System.out.println("Looking up " + counter + " on thread " + Thread.currentThread().getName());
return null;
}));
}

我以为 hibernate 线程会被用来启动其他等待任务,它应该也需要 1 秒。例如,我读过 IO WAINTING 线程状态意味着该线程可以重新用于其他任务。我可以用 Thread.sleep() 测试这个行为吗?是我的测试方法有误还是我理解有误?

最佳答案

一个 hibernate 线程不能用来做另一个线程的工作(特别是,一个线程不能为另一个线程 hibernate )。当第一个线程进入休眠状态时,只有 CPU 可以切换到第二个线程。

当您向 CompletableFuture.supplyAsync() 提供任务时,它会转到 ForkJoinPool 的默认实例,该实例的线程数与您的计算机的 CPU 数一样多。您手动将分配的三个线程设置为您的默认 ForkJoinPool,因此您的九个任务在它们之间平均分配:每个线程连续执行三个任务。因此,您有 3 秒的时间作为结果。

关于java - 在 ForkJoinpool 上使用 CompletableFuture 并避免线程等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39169436/

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