Java8并行流(parallelStream)原理分析及线程池线数设置 我们都知道在java使用strem流做多线程处理是非常方便的。list.parallelStream().forEach(s->{//业务处理});但是parallelStream是如何实现多线程处理的呢?其实看源码我们会发现parallelStream是使用线程池ForkJoin来调度的,这里我们可以看源码看到由于我们使用的forEach,所以直接看类ForEachOps即可.当然其他方法比如reduce等会有不同的实现类,总的实现类是如下几个java.util.stream.FindOps.FindOpjava.util.stream.ForEachOpsjava.util.stream.MatchOps.MatchOpjava.util.stream.ReduceOps.ReduceOp里面基本都是调用evaluateParallel方法而ForEachTask继承关系如下这里就找到了我们的
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
,核心原理就是ForkJoin框架而ForkJoinPool的默认线程数是CPU核数-1,无参构造方法就可以看出如何设置ForkJoinPool的线程数呢这里有如下几种方法直接构建自己的ForkJoinPoolCountDownLatchcountDownLatch=newCountDownLatch(20);intcpu=Runtime.getRuntime().availableProcessors();System.out.println(cpu);ForkJoinPoolpool=newForkJoinPool(2);List
list=IntStream.range(0,20).boxed().collect(Collectors.toList());pool.submit(()->{list.parallelStream().forEach(s->{//业务处理System.out.println("thread:"+Thread.currentThread().getName()+"value"+s);countDownLatch.countDown();});});countDownLatch.await();可以看到始终只有2两个线程使用参数设置System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","5");demo验证System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","5");CountDownLatchcountDownLatch=newCountDownLatch(5);Listlist=IntStream.range(0,20).boxed().collect(Collectors.toList());list.parallelStream().forEach(s->{//业务处理System.out.println("thread:"+Thread.currentThread().getName()+"value"+s);countDownLatch.countDown();});countDownLatch.await();intpoolSize=ForkJoinPool.commonPool().getPoolSize();System.out.println("Poolsize:"+poolSize);这里比较奇怪是设置了5个线程,虽然只有5个,但是主线程也加入了执行,这里暂时不做详细研究,有知道的欢迎留言关注博主即可阅读全文 -全文完-