为什么要使用并行库
在java中,我们通常使用并行库,达到对多核处理器的最大利用,提高程序执行效率。在java8中,我们可以使用parallelStream来做一些并行处理。
public static void main(String[] args) {
testParalle();
}
private static void testParalle(){
Stream<Integer> parallel = Arrays.asList(1, 2, 3, 5, 6, 7,8).stream().parallel();
parallel.forEach(Application::doSome);
}
private static void doSome(int num) {
try {
System.out.println(String.format("time:%s begin:%s",LocalTime.now(),num));
Thread.sleep(num * 500);
System.out.println(String.format("time:%s end:%s",LocalTime.now(),num));
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
并行库的底层
parallelStream默认使用了fork/join框架,其默认线程数是CPU核心数
观察运行结果,可以发现只有4个并行,再次证实了该点(我的cpu是4核)
设置并行数
在某些场景中,我们不希望抢占所有的CPU核心。可以通过ForkJoinPool来设置并行数
public static void main(String[] args) {
//testParalle();
testParalleNum(2);
}
public static void testParalleNum(int parallelism) {
Stream<Integer> stream = Arrays.asList(1, 2, 3, 5, 6, 7,8).stream();
new ForkJoinPool(parallelism).submit(() -> stream.parallel().forEach(Application::doSome)).join();
}
在这里,我们将并行数设置为2,可以看到结果: