Java的并发流,如果直接使用parallelStream,线程数与机器cpu数一样。可以使用ForkjoinPool设置线程。
ForkJoinPool forkJoinPool = new ForkJoinPool(20);
forkJoinPool.submit(() -> {
ist.parallelStream().forEach(item -> {
});
})
ExecutorService使用方法:
ExecutorService executor = Executors.newFixedThreadPool(20);
List<Future> futures = Lists.newArrayList();
orderProds.stream().forEach(orderProd -> {
Future future = executor.submit(() -> {
});
futures.add(future);
});
// 判断是否结束
futures.stream().forEach(future -> {
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
合理设置线程大小
- 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1
- 如果是IO密集型任务,参考值可以设置为2*NCPU
当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。