【Java并发·03】CompletableFuture入门

作者: 灰_灰分类: 计算机技术 发布时间: 2021-02-05 19:03:17 浏览:46606 次

【Java并发·03】CompletableFuture入门

佳帝董肝宁:
这么优秀的up,我咋现在才发现[脱单doge]

ogailii:
讲的很好 加油 比大部分教程看的有意思 而且不会枯燥 节省了大量的时间

【回复】这就是我想达到的效果[tv_可爱]
【回复】回复 @灰_灰 :太喜欢了这种感觉了![打call][打call][打call]
海绵宝宝消失的欢乐:
我有个实际的问题,想问问up主怎么实现。比如我有一堆ids,有3个方法需要根据这个ids拿结果,其中的一个返回的结果a是另外3个方法的输入,然后根据结果a遍历,将其他5个方法的结果附加上去。这种嵌套式的要怎么做呢?我目前是通过两层allOf实现的,想通过thenCombine实现,但感觉很复杂。希望up指点迷津。PS:Java的这块API设计的真是拉垮,虽然我不知道怎么实现更好,但我觉得这个肯定不好。

【回复】import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; public class PhoneTest { static ConcurrentHashMap<Long, Phone> idAndPhone = new ConcurrentHashMap<>(); public static void main(String【】 args) { /** * 1、并行流方式 */ List<Phone> result1 = Stream.of(1L, 2L, 3L) .parallel() .map(PhoneTest::idToPhoneAsync) .collect(Collectors.toList()); /** * allOf 方式 */ List<CompletableFuture> ids = Stream.of(1L, 2L, 3L) .map(PhoneTest::idToPhoneCompletableFuture) .collect(Collectors.toList()); CompletableFuture .allOf(ids.toArray(new CompletableFuture【ids.size()】)) .join(); // 从idAndPhone 中取结果 }
【回复】看了你的代码我大概明白你的意思了。 - 假设现在有3个型号手机,都需要做 质量检测、安全检测等等操作。 - 首先,这种计算密集型操作不建议开太多线程。 - 也就是说,一个型号手机对应一个线程,这样的话你的编程模型会简单很多,因为都是针对单部手机的 直接用并行流(parallel stream)就行了,都不用 CompletableFuture - 你现在是 给每个检测开一个线程 先把3个型号手机的质量检测做完,再去做3个型号手机的 安全检测 这样的话编码会复杂些 ,因为检测方法就需要 批量操作 - 再来说说 allOf 如果你想用的话呢,直接在外部套一层就行了,不过用 allOf 的话,没法直接取到返回值,要放到外部容器中 两层 allOf 是非常不建议的,任务开多了并不是什么好事 - 再来说说 thenCombine 。这个例子我个人觉得是用不到 thenCombine 的 如果你觉得手机的多个检测可以并行,那么在每个型号手机内部,你可以用用 thenCombine 这个例子我也写出来了 以上所有是我个人建议,仅供参考 你自己的实际情况需要根据实际场景做决定
【回复】回复 @海绵宝宝消失的欢乐 :那你就用两层allof好了,第一层包装第二层,第二层批量请求某个接口。 你这个问题的重点是性能问题,需要自己定制线程池来优化。 我更新到性能的时候估计两个月后了。你可以去看看并发编程相关的书籍或者博客之类的
bili_23014793310:
讲的很棒,真激动 找了半年才看到这么优秀的视频,up主辛苦了,

空指针exc:
public static void main(String【】 args) { SmallTool.printTimeAndThread("小白进入餐厅"); SmallTool.printTimeAndThread("小白点了一份米饭+小炒肉"); CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("厨师做小炒肉"); SmallTool.sleepMillis(2000); return "厨师做饭done"; //这个S上一步完成的内容, }).thenCompose(dish -> CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("服务员做饭"); SmallTool.sleepMillis(100); return dish + "+服务员做好饭了"; }) ); SmallTool.printTimeAndThread("小白打王者"); SmallTool.printTimeAndThread("小白吃饭,"+cf1.join()); }

KingYxy:
为什么我的thenCompose()方法出来的厨师炒菜和服务员打饭是在一个线程的呀?up主~

【回复】继续看,后面的课程有讲到
丶Saiph:
真的是我见过国内最好的多线程教学视频了,比一堆机构只会念ppt讲概念,讲完不知道怎么用的好太多,科普+实际应用的教学方式完全符合初学者入门的需求,每一集之间还有衔接 跟追番一样天呐

HaHa666HaHa:
讲的很好 通俗易懂 可以看出up主非常用心

缘来愢你:
赞一个,讲的很棒,希望有生之年能把up主的多线程追完。

【回复】[笑哭] 希望我有生之年能把这个系列更完 对了,这周 会更一集上去的
--Mirage--:
其实,能听明白,但是令我记忆最深刻得是那个%s,百度了一下是string.format()方法的转换符,不同类型对应不同的转换符

bili_62661503565:
这个博主还分享了hystrix的原理,同样棒棒哒。

sanne2:
up主可以考虑出下Junit的视频吗,测试这块比较少人做,而且实际工作中怎么用更少教程,谢谢你的教程

【回复】回复 @爬上屋顶吹一夜风 :[喜极而泣]点击率低的视屏,系统都不会推送。哪天意外粉丝量暴涨以后,再做才有效果
【回复】回复 @灰_灰 :事实的确是这样,高端玩家毕竟很少,能传播很广的一定不是什么难的,而且基础东西谁也绕不过,大部分人是三分钟热度,up主可以做一些基础视频,并不是java基础,把java基础难点,重点 做几集。做基础视频目的就是引流。 正如up主说的,技术精进这玩意要耐得住寂寞,脚踏实地的去做。up可以向社区发展,受众面向中开,高开。 这期视频播放量不高的原因我感觉是 CompletableFuture 、函数编程 这套东西小厂压根没有,大厂也是部分部门涉及而且内部较强
【回复】回复 @爬上屋顶吹一夜风 :小众的搜的也就那么几百个 做个大众的也许一开始推送的播放量就大于小众好几个月的播放量 这不是逻辑问题,是现实问题。有好多粉丝几百几千的up想了多少小众的题材,最后都放弃了。昨天看到有几个做摄影的up,我看了几期,也是用心在做,两个多月播放量几百。这类up你们观众很少感知到,但这类up的数量还真不在少数 我要不是当个兴趣做做,坚持不了这么长时间。这事,随缘吧

教学视频 编程 CompletableFuture thenCompose thenCombine 并发 Java 异步

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!