目的

提高程序运行效率, 减少响应时间或者增加吞吐量

例子代码

最近罗*祥, 福报厂P12 jf 引起了大家的关注, 二位都是因为私人生活问题, 搞的微博程序员天天加班加服务器, 让我等吃了一个又一个瓜, 真是犯了全天下男人都会犯的错, 我感觉我就不会犯这种错, 当然是因为我是个好男人主要是因为没钱, 没名, 身体也…

行了行了, 说远了, 我们还是可以从他们身上学习到这个时间管理大法的, 从而可以有时间多参加 ‘多人运动’

我们假设有这么一个 ‘太虚公子’ 这个一个坏男孩, 要和三位女孩一起玩(shui)耍(jiao)

坏男孩类:

@Data
@AllArgsConstructor
public class BadBoy {private String name;public void playWithGirls(List<Girl> girls) {for (Girl girl : girls) {girl.playWithBody(this);}}
}

女孩类:

@Data
@AllArgsConstructor
public class Girl {private String name;@SneakyThrowsvoid playWithBody(BadBoy badBoy) {System.out.println(name + "开始和" + badBoy.getName() + "玩");doSomethingMySelf();System.out.println(name + "玩完了");}private void doSomethingMySelf() throws InterruptedException {//'睡觉' 1 秒完事Thread.sleep(500);System.out.println(name + "自己吃饭, 化妆, 发微博");Thread.sleep(500);}
}

我们让 ‘太虚公子’ 与三位女孩玩耍:

StopWatch stopwatch = StopWatch.createStarted();
BadBoy lzx = new BadBoy("空虚公子");
lzx.playWithGirls(List.of(new Girl("周*青"), new Girl("花花董花花"), new Girl("张大*")));
stopwatch.stop();
System.out.println("total time: " + stopwatch.getTime(TimeUnit.SECONDS));

我们看下输出和总耗时:

周*青开始和 空虚公子玩
周*青自己吃饭, 化妆, 发微博
周*青玩完了
花花董花花开始和 空虚公子玩
花花董花花自己吃饭, 化妆, 发微博
花花董花花玩完了
张大*开始和 空虚公子玩
张大*自己吃饭, 化妆, 发微博
张大*玩完了
total time: 3

问题分析

就是时间管理不太好, 三个女孩需要三秒, 那不是太慢了, 能不能三个女孩就花一秒多的时间就能行呢

并行流模式

我们定义一个时间管理大师坏男孩:

@Data
@AllArgsConstructor
public class ParallelBadBoy {private String name;public void playWithGirls(List<Girl> girls) {girls.parallelStream().forEach(girl -> girl.playWithBody(this));}
}

Girl 增加一个与时间管理大师玩的多态方法:

@Data
@AllArgsConstructor
public class Girl {private String name;@SneakyThrowsvoid playWithBody(BadBoy badBoy) {System.out.println(name + "开始和" + badBoy.getName() + "玩");doSomethingMySelf();System.out.println(name + "玩完了");}@SneakyThrowsvoid playWithBody(ParallelBadBoy badBoy) {System.out.println(name + "开始和" + badBoy.getName() + "玩");doSomethingMySelf();System.out.println(name + "玩完了");}private void doSomethingMySelf() throws InterruptedException {//'睡觉' 1 秒完事Thread.sleep(500);System.out.println(name + "自己吃饭, 化妆, 发微博");Thread.sleep(500);}
}

调用:

StopWatch stopwatch = StopWatch.createStarted();
ParallelBadBoy lzx = new ParallelBadBoy("八爪鱼");
lzx.playWithGirls(List.of(new Girl("周*青"), new Girl("花花董花花"), new Girl("张大*")));
stopwatch.stop();
System.out.println("total time: " + stopwatch.getTime(TimeUnit.SECONDS));

输出:

周*青开始和八爪鱼玩
花花董花花开始和八爪鱼玩
张大*开始和八爪鱼玩
花花董花花自己吃饭, 化妆, 发微博
张大*自己吃饭, 化妆, 发微博
周*青自己吃饭, 化妆, 发微博
花花董花花玩完了
张大*玩完了
周*青玩完了
total time: 1

更近异步

如果不自定义线程池, 默认的是一个公有的线程池, 坏男孩太多了反而可能比串行还慢

@Data
@AllArgsConstructor
public class ParallelBadBoy {private static final ForkJoinPool COLUMN_POOL = new ForkJoinPool(30);private String name;public void playWithGirls(List<Girl> girls) {COLUMN_POOL.submit(() -> girls.parallelStream().forEach(girl -> girl.playWithBody(this)));}
}

课后作业

  1. 把 BadBoy 和 ParallelBadBody 抽象成一个类
  2. 思考并行流一定可以加快速度么
  3. 了解普通线程池的技术和并行流线程池的区别, 比较二者的优劣, 我们有这么一个贷款产品需要展示给用户, 如果需要从多个系统取数据做聚合展示, 比如从 A 系统取期限, 还款方式和可贷额度, 从B 系统取优惠卷列表, C 系统取登录用户信息, 这种情况是否适合使用并行流方式

微信:

想参加多人运动?并行流(ParallelStream)模式教你成为时间管理大师相关推荐

  1. system流怎么判断为空_并行流ParallelStream中隐藏的陷阱

    点击上方蓝字 ↑↑ Throwable文摘 关注公众号设置星标,不定时推送高质量原创文章 关注 前提 这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱,这个问题其实离我们很近, ...

  2. Java8 并行流(parallelStream)原理分析及注意事项

    文章目录 前言 一.parallelStream是什么 二.parallelStream原理分析 1.Fork/Join框架 1.1 work-stealing(工作窃取算法) 1.2 常用方法 2. ...

  3. 想成为时间管理大师?试试番茄工作法!(内含 Python 实现)

    这是「进击的Coder」的第 709 篇技术分享 作者:Ckend 来源:Python 实用宝典 " 阅读本文大概需要 5 分钟. " 番茄工作法,是一种时间管理方法.掌握了它,或 ...

  4. 想成为时间管理大师?试试番茄工作法!(内含Python实现)

    番茄工作法,是一种时间管理方法.掌握了它,或许你就能成为时间管理大师. 番茄工作法有五个基本步骤: 1.决定待完成的任务 2.设定番茄工作法定时器至 n 分钟 (通常为25分钟) 3.持续工作直至定时 ...

  5. parallelstream启动的线程数_谈谈并行流parallelStream

    一.parallelStream是什么 Java8中提供了能够更方便处理集合数据的Stream类,其中parallelStream()方法能够充分利用多核CPU的优势,使用多线程加快对集合数据的处理速 ...

  6. mybatisplus代码生成器_想做时间管理大师?你可以试试Mybatis Plus代码生成器

    1. 前言 对于写Crud的老司机来说时间非常宝贵,一些样板代码写不但费时费力,而且枯燥无味.经常有小伙伴问我,胖哥你怎么天天那么有时间去搞新东西,透露一下秘诀呗. 好吧,今天就把Mybatis-pl ...

  7. java并行流 阻塞主线程_记一次使用Java8并行流导致的服务瓶颈问题排查

    一.业务背景# 二.服务架构# 服务使用线程池对请求进行业务处理,corePoolSize=32,maximumPoolSize=128. 三.问题描述# 服务部署到测试环境,将线上流量通过tcp-c ...

  8. 安卓手机管理软件_5款高效时间管理软件:坚持一星期,让你和90%的人拉开差距...

    大多数人经常被「拖延症」所扰,虽然肩负满身的DDL,依旧提不起工作和办事效率,被工作和业务追着跑. 不管你身处哪个行业,对自己的时间和工作任务进行管理,制定详细的行动计划是走向成功之路的重要一步.人们 ...

  9. Stream流和ParallelStream并行流详解及对比

    目录 前言 一.Stream流是什么? 二.获取Stream流的方式 三.Stream流中的常用方法 1. forEach(遍历/终结方法) 2. filter(过滤) 3. map(映射转换) 4. ...

最新文章

  1. 土地利用转移矩阵图怎么做_土地利用转移矩阵生成的几种方法
  2. linux adb 点击屏幕,ADB 操作命令(二)
  3. jni c运行java字符串,通过JNI将C ++字符串发送到Java
  4. 新疆计算机一级考试试题手机软件,新疆维吾尔自治区计算机一级考试理论题库(最新最完整)...
  5. React开发(266):ant design customRequest
  6. CDH - 启动HbaseMaster时异常
  7. Ajax基础知识梳理 1
  8. 【SQLAlchemy】SQLAlchemy技术文档(中文版)(上)
  9. 实体词典 情感词典_情感词典
  10. dex2jar java 1.8_利用 dex2jar 反编译 dex文件
  11. matlab做聚类分析(简单的直接用clusterdata)
  12. linux中硬链接可以跨分区呀,linux中硬链接与软链接
  13. 【JavaScript进阶学习】NodeJs语言的介绍及基本使用
  14. 翻过这道山,就有人听到你的故事。
  15. 1471_TC275的内核种类以及ID判断
  16. python-短网址批量还原
  17. 中文提交到git乱码_解决git 提交后中文字符会乱码的问题
  18. Camstar权限错误is not authorized to perform the service
  19. 在 Linux 和 FireWire 上创建自己的 RAC 集群
  20. photoshop CC2017好玩的脸部智能识别液化

热门文章

  1. 用C语言进行公英单位转换方法
  2. com.alibaba.otter.canal.protocol.exception.CanalClientException
  3. Linux 有关时间日期和时区设置
  4. 日活跃用户1亿,它凭什么一跃成为最受欢迎的社交App?
  5. 年月日软件测试用例的设计,实验三日期题白盒测试用例设计.doc
  6. 知识图谱可视化应用研究现状文献综述
  7. python图片压缩算法_使用K均值算法进行图片压缩
  8. 使用宝塔面板快速搭建谷歌出品图片在线压缩工具 - Squoosh
  9. 27岁年入千万的李佳琦:以为钱很好赚,是年轻人的最大错觉
  10. 使用Typora工具绘制流程图