多线程自定义fork-join池正在java程序中与公共池一起使用
我已经创建了下面的程序,我正在尝试将自定义fork-join池传递到其中,我不想使用公共连接池,但我仍然看到公共池正在使用,即使在传递fork-join池之后。请解释为什么会发生这种情况
package com.example.javanewfeatures;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ForkJoinPoolExample {
public static void main(String args[]) throws InterruptedException {
List<Integer> numbers = buildIntRange();
ForkJoinPool forkJoinPool = new ForkJoinPool(4);
Thread t1 = new Thread(() -> forkJoinPool.submit(() -> {
numbers.parallelStream().forEach(n -> {
try {
Thread.sleep(5);
System.out.println("Loop 1 : " + Thread.currentThread());
} catch (InterruptedException e) {
}
});
}).invoke());
ForkJoinPool forkJoinPool2 = new ForkJoinPool(4);
Thread t2 = new Thread(() -> forkJoinPool2.submit(() -> {
numbers.parallelStream().forEach(n -> {
try {
Thread.sleep(5);
System.out.println("Loop 2 : " + Thread.currentThread());
} catch (InterruptedException e) {
}
});
}).invoke());
t1.start();
t2.start();
t1.join();
t2.join();
}
private static List<Integer> buildIntRange() {
return IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());
}
}
# 1 楼答案
当然,当您创建
ForkJoinPool
的实例时,不会使用公共池。您可以打印以下语句,以确保情况并非如此但是在您的例子中,公共池不是由您的任务使用的,而是由
Streams
用于并行计算现在,如果您想让streams使用自定义池,那么您可以引用这个post-Parallel streams in custom pool
在您当前的实现中,这就是行为
Thread t1
上触发,因此任务将提交到公共池。请参阅下面的ForkJoinTask.doInvoke()
源代码:如上文所述,要更正您的实现,您可以进行以下更改
输出: