JDK1.8新特性【之】串行流、并行流、工作窃取模式(Fork/Join)

1.串行流、并行流

  • 串行流:为单线程执行
  • 并行流:工作时会将任务,拆分为多个子任务,最终汇总数据得到结果
  • 并行流 启动多线程数 默认为(CPU核数-1)

2.工作窃取模式( Fork/Join)

  • 工作窃取模式 Fork/Join
    • 并行流采取的是工作窃取模式,线程自身任务执行完毕后会去其他线程队列中获取最后一个任务,放进自己的队列> 里执行
    • 如果碰到需要等待的情况,不会进行等待,而是直接去执行其他子任务

3.测试

  • 打开任务管理器
  • 注释并行流代码时:执行耗时30s,CPU 资源占用率提升了8%
  • 注释串行流代码:执行耗时8s,CPU直接沾满 100%

在这里插入图片描述

4.完整源码

import java.util.stream.LongStream;

/**
 * 串行流,为单线程执行
 * <p>
 * 并行流,工作时会将任务,拆分为多个子任务,最终汇总数据得到结果
 * 启动多线程数大致为(CPU核数-1)
 * <p>
 * 工作窃取模式 Fork/Join
 * 并行流采取的是工作窃取模式,线程自身任务执行完毕后,会去其他线程队列中获取最后一个任务,放进自己的队列里执行
 * 如果碰到需要等待的情况,不会进行等待,而是直接去执行其他子任务
 */
public class _Test {

    public static void main(String[] args) {

        /**
         * 测试累加
         * 串行流需要耗时 30s
         */
        long l1 = System.currentTimeMillis();
        long reduce = LongStream.rangeClosed(0, 100000000000L)
                .sequential()
                .reduce(0, Long::sum);
        long l2 = System.currentTimeMillis();
        System.out.println("串行流耗时:" + (l2 - l1) / 1000 + "s");//30s

        /**
         * 测试累加
         * 并行流流需要耗时 8s
         */
        long l3 = System.currentTimeMillis();
        long reduce1 = LongStream.rangeClosed(0, 100000000000L)
                .parallel()
                .reduce(0, Long::sum);
        long l4 = System.currentTimeMillis();
        System.out.println("并行流耗时:" + (l4 - l3) / 1000 + "s");//8s

    }

}

《目录:Java基础》

《目录:JDK1.8新特性》

《幕》

  • 留白 —<老吉>
  • ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长毛山顶洞人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值