代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

25 | 使用有序的代码,调动异步的事件

公布代码在讨论区,共同学习和进步
测试异步编程与同步编程模式的性能差异
简单的测试代码性能的工具
服务端使用异步模式处理客户端的HTTP请求数据
客户端使用HttpClient接口发起HTTP连接
丰富异步连接编程的基本框架
通过有序的代码调动独立的事件来更有效地利用计算资源
异步编程的基本概念
示例:使用ByteBuffer.allocateDirect()方法
使用共享内存和减少内存拷贝
减少实例数量和尺寸
减少CPU消耗
示例:简单异步服务的框架
异步编程对性能的提升
操作系统对异步I/O的支持
依赖底层硬件和操作系统
示例:使用HttpClient接口的异步模式
异步编程与生活模式的贴近性
以事件驱动的编程模型
从过程到事件的转变
有效利用计算资源
异步 vs. 同步编程模型
下一步
一起来动手
小结
零拷贝,进一步的性能提升
异步是怎么实现的?
从过程到事件
为什么需要异步编程?
异步编程

该思维导图由 AI 生成,仅供参考

同步和异步,是两个差距很大的编程模型。同步,就是很多事情一步一步地做,做完上一件,才能做下一件。异步,就是做事情不需要一步一步的,多件事情,可以独立地做。
比如一个有小鸟的笼子,如果打开笼门,一个一个地放飞小鸟,就是同步。如果拆了整个鸟笼,让小鸟随便飞,爱怎么飞就怎么飞,这就是异步。

为什么需要异步编程?

如果我们观察身边的事物,现实中有很多事情是以异步的方式运营的。我们挤地铁的时候,从来都是好几个人一起挤进去的。当我们正在挤地铁时,外面的风照旧吹,雨照旧下,天坛的大爷大妈们正在秀着各种绝活。没有任何事情会因为我们正在挤地铁就停止活动,等我们挤完地铁再恢复运转。
可是,要是说到其中的任何一个人,就不能同时做两件事情了。在挤地铁的时候,就不能在天坛秀绝活。我们写的程序也是这样,先执行第一行,再执行第二行。哪怕第二行再怎么费周折,第三行代码也要等着。
第二行代码可能需要执行大量的计算,需要很多的 CPU;也可能需要大量的传输,占用 I/O 通道。可是,它不一定会把所有的计算机资源都占用了。
如果第二行代码占用了 I/O,我们能不能把多余的 CPU 用起来?如果第二行代码占用了 CPU,我们能不能把空闲的 I/O 用起来? 也就是说,能不能把计算机整体资源更有效地使用起来?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异步编程:提升效率的关键 异步编程是一种与传统同步编程模型有着巨大差异的编程方式。通过生活中的例子,我们深入探讨了异步编程的必要性以及其基本处理逻辑。对比传统同步编程和异步编程,我们使用JDK 11的HttpClient接口和JDK 10以前的HttpURLConnection接口进行了对比,阐述了异步编程的过程和事件转变。同时,我们还介绍了异步编程的实现原理,以及如何通过异步I/O和零拷贝进一步提升性能。通过这些例子和解释,读者可以快速了解异步编程的概念、优势和实现方式,以及如何应用于实际开发中。 异步编程的核心概念是事件驱动的模型,通过有序的代码调动独立的事件,更有效地利用计算资源。我们提供了一些例子,构建了异步连接编程的基本框架,读者可以尝试丰富这些代码,组成一个可以运行的客户端和服务端。客户端使用HttpClient接口发起HTTP连接,而服务端则使用异步模式,将客户端的HTTP请求数据原封不动地发回去。 在下一篇文章中,我们将介绍一个简单的测试代码性能的工具,读者可以继续测试自己编写的代码的性能,看是否比同步的编程模式有所提高。欢迎将你的代码分享在讨论区,让我们一起学习,一起进步。如果你想和朋友或者同事比试一下,不妨把这篇文章分享给他们,互相切磋。 异步编程是提升效率的关键,通过本文的介绍和例子,读者可以深入了解其技术特点,为实际开发中的应用提供了有力支持。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 正在减肥的胖籽。
    范老师您好,在Java项目中,tomcat的线程一般开多少个线程比较好?这块有好的心德吗?在项目开发过程中一直对线程池的个数拿捏不准。

    作者回复: 一般的,线程个数和很多因素相关,比如软件架构、用户数等。线程数和CPU数匹配是一个常见的设置,但是也仅适用于少数场景,比如每个计算任务都很快。性能参数选择,一般可以做成可配置的,然后反复测试,找到合适的组合。 很抱歉,我不了解tomcat的细节,没有办法给你建议。留言区的小伙伴们帮帮忙!

    2019-03-01
    4
  • 轻歌赋
    其实我更想知道异步编程的一些编码规范,来帮助我少些一些多线程异常代码

    作者回复: 异步编程的编码模式吗? 编码规范,如果你指的是代码规范,和普通的代码规范区别不大。

    2019-03-06
    1
  • 刚毅坚卓
    异步编程就像,你在等排队处理业务时顺便玩一下手机。等排到你的时候,你再把手机放好,然后精力转过来处理业务;或者是把手机上的事情弄好,再来处理业务 不知道这样理解对不对呢

    作者回复: 哈哈,好玩的类比啊。不过,玩手机被中断了,这是同步。

    2022-04-29
  • 黄智勇
    这就体现了我用nodejs来做开发的优势了,async/await 的方式,还可以开发异步程序像开发同步程序,开发效率一样高
    2019-03-02
    6
  • ifelse
    异步编程,常见的模型是事件驱动的。我们通过使用有序的代码,调动独立的事件,来更有效地利用计算资源。--记下来
    2022-07-25
  • 进化菌
    异步,就是不同步,把事情交给对方,对方完成或异常都会有所反馈。 这在很多地方会用的到,比如写日志,比如通知……
    2021-12-03
  • 程序员汪师傅
    httpClient.sendAsync(httpRequest, BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println); 在异步处理的时候,是在哪个线程执行的,什么时候执行呢。在异步的时候线程是如何被调度的。例如thenApply是sendSync返回之后执行的,那么是谁(哪个线程)在执行它,是如何触发执行的呢
    2020-12-15
  • William
    异步处理,优点不阻塞当前线程. 前提是当前的请求不要求及时返回结果数据,可以采用异步方式.
    2019-06-18
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部