ForkJoinPool使用时的一些问题
1、ForkJoinPool的简单使用
下面展示ForkJoinPool与parallelStream的常用方法。
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 1000; i++) {
list.add(i);
}
// ForkJoinPool 的默认线程数量为系统核心数
ForkJoinPool forkJoinPool = new ForkJoinPool(10); //10个线程
forkJoinPool.submit(() -> {
// 使用并发流来处理,另外,这也是常用的修改parallelStream线程数方法
list.parallelStream().foreach(i -> {
System.out.println(i + "");
// ...
})
})
2、awaitTermination(int num,TimeUnit)
ForkJoinPool提供了awaitTermination方法
3、 控制ForkJoinPool中的子线程与主线程之间的执行顺序
如果想要ForkJoinPool中的子线程任务执行完之后再执行main方法,有两种方式:
第一种,使用isTerminated()方法来判断
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 1000; i++) {
list.add(i);
}
// ForkJoinPool 的默认线程数量为系统核心数
ForkJoinPool forkJoinPool = new ForkJoinPool(10); //10个线程
forkJoinPool.submit(() -> {
// 使用并发流来处理,另外,这也是常用的修改parallelStream线程数方法
list.parallelStream().foreach(i -> {
try {
Thead.sleep(20);
} catch(Exception e) {
// ...
}
System.out.println("子线程执行" + i);
// ...
})
})
//不再接受新的任务
pool.shutdown();
while (true) {
if (pool.isTerminated()) {
System.out.println("子线程任务执行结束");
break;
}
}
System.out.println("主线程执行...");
第二种,使用FutureTask(推荐)
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 1000; i++) {
list.add(i);
}
// ForkJoinPool 的默认线程数量为系统核心数
ForkJoinPool forkJoinPool = new ForkJoinPool(10); //10个线程
Object o = forkJoinPool.submit(() -> {
// 使用并发流来处理,另外,这也是常用的修改parallelStream线程数方法
list.parallelStream().foreach(i -> {
try {
Thead.sleep(20);
} catch(Exception e) {
// ...
}
System.out.println("子线程执行" + i);
// ...
})
}).get(); // 主线程在调用get时会阻塞至forkJoinPool全部执行完成
//不再接受新的任务
pool.shutdown();
System.out.println("主线程执行...");