多线程优化性能,串行操作并行化

串行操作

// 以下2个都是耗时操作
doBizA();
doBizB();

修改变为并行化

new Thread(() -> doBizA()).start();
new Thread(() -> doBizB()).start();

异步化,是并行方案的基础,利用多线程优化性能。性能优化是大厂的核心需求

jdk1.8提供了CompletableFuture 来支持异步编程

CompletableFuture工具类还是很复杂的,需要做好心理准备

1.CompletableFuture实现烧水泡茶



任务3需要等待任务1和任务2都完成才能开始

范例

public static void tea(){
CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> {
System.out.println("T1:洗水壶...");
sleep(1);
System.out.println("T1:烧开水...");
sleep(15);
}); CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
System.out.println("T2:洗茶壶...");
sleep(1);
System.out.println("T2:洗茶杯...");
sleep(2);
System.out.println("T2:拿茶叶...");
sleep(1);
return "龙井";
}); CompletableFuture<String> f3 = f1.thenCombine(f2,(__, tea) -> {
System.out.println("T1:拿到茶叶:" + tea);
System.out.println("T1:泡茶...");
return "tea:" + tea;
}); System.out.println(f3.join());
}

核心4个静态方法

runAsync(Runnable runnable)   runnable接口的run方法没有返回值
supplyAsync(Supplier<U> supplier) Supplier接口的get方法有返回值

这2个方法,有重载方法,重载方法,支持传入自定义的线程池对象,默认不传使用的是jdk带的ForkJoinPool线程池,默认线程数是cpu核数的2倍

强烈建议,不同的业务类型创建不同的线程池,不要随便使用ForkJoinPool线程池,避免互相干扰

注意:

2个关注点

异步操作什么时候结束

如何获取异步操作的执行结果

都可以通过future接口get来解决

2.理解CompletionStage接口

1.串行关系

CompletableFuture f0 = CompletableFuture.supplyAsync( () -> "Hello World") //①
.thenApply(s -> s + " QQ") //②
.thenApply(String::toUpperCase);//③
System.out.println(f0.join());//输出结果HELLO WORLD QQ

2.AND汇聚关系

// 等f1,f2都执行完,f3开始执行
CompletableFuture<String> f3 = f1.thenCombine(f2,(__, tea) -> {
System.out.println("T1:拿到茶叶:" + tea);
System.out.println("T1:泡茶...");
return "tea:" + tea;
});

最新文章

  1. 浅析初等贪吃蛇AI算法
  2. 【leetcode】Symmetric Tree
  3. 用python写一个hello world程序
  4. iOS: 实现苹果的内购
  5. HDOJ-三部曲一(搜索、数学)- A Knight&#39;s Journey
  6. Python之路,Day18 - 开发一个WEB聊天来撩妹吧
  7. NSURLConnect 的简单实用(iOS8淘汰)
  8. jacascript JSON对象的学习
  9. 《linux就该这么学》第十四节课:第13章,部署DNS域名解析服务(bind服务)
  10. RestTemplate invoke JSON and convert to Object
  11. flex布局下overflow失效问题
  12. caffe调loss方法
  13. Java中动态获取项目根目录的绝对路径
  14. linux 的常用命令---------第五阶段
  15. 201621123010《Java程序设计》第13周学习总结
  16. 增强学习训练AI玩游戏
  17. 使用TensorFlow识别照片中的物体
  18. 在jsp页面动态添加数据库中的内容
  19. Android IntentFilter 匹配原则浅析
  20. Redis底层探秘(二):链表和跳跃表

热门文章

  1. CS与MSF之间的会话传递
  2. netcore获取配置文件的内容
  3. Kernighan《UNIX 传奇:历史与回忆》杂感
  4. UVA10970大块巧克力
  5. UVA11997求前k个和,多路归并问题
  6. C#-获取磁盘,cpu,内存信息
  7. markdown 实现代码折叠效果
  8. angr脚本——以angrctf解题记录为参考
  9. JAVA教程 Java学习路线
  10. 【转】风控中的特征评价指标(二)——PSI