调用与获取 ForkJoinPool [重复]

问题描述 投票:0回答:1

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

看一下这段代码:

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 concurrency java-stream
1个回答
1
投票

当您在 ForkJoinTask 上执行

invoke()
时,您会强制它执行。 但在你已经将它提交到池中执行之前,所以你执行了两次。

执行

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

© www.soinside.com 2019 - 2024. All rights reserved.