前提:我对并发不是很熟悉。
看一下这段代码:
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()
之间的区别吗?
当您在 ForkJoinTask 上执行
invoke()
时,您会强制它执行。
但在你已经将它提交到池中执行之前,所以你执行了两次。
执行
get()
将等待任务(已提交到池中)完成并返回结果。