提问人:betta7391 提问时间:3/7/2023 最后编辑:betta7391 更新时间:3/7/2023 访问量:76
调用与获取 ForkJoinPool [重复]
Invoke vs Get ForkJoinPool [duplicate]
问:
前提:我对并发不是很熟悉。
请看这段代码:
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
public class TestSync {
public static void main(String[] args) {
List<Integer> intArray = IntStream.rangeClosed(1, 500).boxed().toList();
System.out.println("Element size: " + intArray.size());
AtomicInteger i = new AtomicInteger(intArray.size());
ForkJoinPool customThreadPool = new ForkJoinPool(50);
customThreadPool.submit( () -> {
intArray.parallelStream().forEach(sp -> {
System.out.println("Remaining int: " + i.decrementAndGet());
});
}).invoke();
customThreadPool.shutdown();
}
}
相关输出为:
Element size: 500
Remaining int: 499
Remaining int: 498
Remaining int: 497
Remaining int: 495
Remaining int: 494
Remaining int: 493
Remaining int: 492
Remaining int: 491
Remaining int: 490
Remaining int: 489
Remaining int: 488
Remaining int: 487
....
Remaining int: -74
Remaining int: -75
Remaining int: -66
Remaining int: -77
Remaining int: -78
Remaining int: -79
Remaining int: -80
Remaining int: -81
Remaining int: -82
Remaining int: -83
...
如果我将 替换为 ,负数将永远不会出现。invoke()
get()
有人能帮我理解 和 之间的区别吗?invoke()
get()
答:
1赞
Krzysztof Krasoń
3/7/2023
#1
当您在 ForkJoinTask 上执行时,您可以强制它执行。
但是在您已经提交它以在池中执行之前,您执行了两次。invoke()
执行将等待任务(已提交到池)完成并返回结果。get()
评论
0赞
betta7391
3/7/2023
感谢您的重播。所以我认为如果我使用 ForkJoinPool,最好的办法是使用该方法。在我的实际案例中,我正在尝试在quarkus应用程序中使用它;使用方法我得到这个错误:。你有没有遇到过类似的问题?get()
get
java.util.concurrent.ExecutionException: java.util.ServiceConfigurationError: io.smallrye.config.SmallRyeConfigFactory: io.quarkus.runtime.configuration.QuarkusConfigFactory not a subtype
评论