WANG LH , Research & Development

线程池&并发流

2018.05.02 17:33

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();
      }
});

合理设置线程大小

  1. 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1
  2. 如果是IO密集型任务,参考值可以设置为2*NCPU

当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。