调用与获取 ForkJoinPool [重复]

Invoke vs Get ForkJoinPool [duplicate]

提问人:betta7391 提问时间:3/7/2023 最后编辑:betta7391 更新时间:3/7/2023 访问量:76

问:

前提:我对并发不是很熟悉。

请看这段代码:

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()

Java 并发

评论


答:

1赞 Krzysztof Krasoń 3/7/2023 #1

当您在 ForkJoinTask 上执行时,您可以强制它执行。 但是在您已经提交它以在池中执行之前,您执行了两次。invoke()

执行将等待任务(已提交到池)完成并返回结果。get()

评论

0赞 betta7391 3/7/2023
感谢您的重播。所以我认为如果我使用 ForkJoinPool,最好的办法是使用该方法。在我的实际案例中,我正在尝试在quarkus应用程序中使用它;使用方法我得到这个错误:。你有没有遇到过类似的问题?get()getjava.util.concurrent.ExecutionException: java.util.ServiceConfigurationError: io.smallrye.config.SmallRyeConfigFactory: io.quarkus.runtime.configuration.QuarkusConfigFactory not a subtype