文章插图
- 上图的方法是在中实现的,打开代码后吓了我一跳,估计quarkus的人也怕被喷,在注释中看到了他们满满的求生欲:代码写成这样是为了性能考虑,这样写就是单态调用,取代了简化写法中的多态调用,会有更好的性能表现(不敢说学到了新技术,只能说开阔了眼界)

文章插图
- 上面的代码其实就是调用hanler的handle方法,所以,是时候去看那个BlockingHandler的handler方法了
- 刚打开代码就大呼一声痛快!如下图,handler将虚拟线程的executor和web请求的上下文对象requestContext串起来了,接下来该去箭头2所指的resume中一探究竟,我这里大胆的猜一下,resume方法中要做的事情应该和Runnable有关,理由很简单:Runnable和Executor不就是配合着用的嘛

文章插图
- 上图箭头2的代码在AbstractResteasyReactiveContext.java中,先看这个AbstractResteasyReactiveContext类,果然实现了Runnable

文章插图
- 接下来该看AbstractResteasyReactiveContext#resume方法了,看之前我猜应该是executor.execute(this),因为我只会这么写...,打开代码一看就乐了,原来我只会这么写就够了,因为他们也是这么写的,注意箭头2,本文的核心也就是这段代码了

文章插图
- 写到这里,关于executor的使用也全部分析完了,用一个简化图小结吧

文章插图
- 至此,quarkus支持虚拟线程的相关代码已经阅读完毕,这里再做个小结:
- 咱们在web接口类上添加的@RunOnVirtualThread注解,会存入每个web接口方法对应的ResourceMethod对象中
- 应用在初始化的时候,检查web接口方法对应的ResourceMethod对象,如果需要在虚拟线程中响应,就给这个web接口绑定一个BlockingHandler对象,此对象有个成员变量,是个executor,是通过Executors.newVirtualThreadPerTaskExecutor()方法创建的
- web请求到达时,web接口方法的handler对象会被拿来执行其handler方法,BlockingHandler也是其中之一
- BlockingHandler的handler方法中,会使用executor.execute方法来执行web响应逻辑,此方法会创建创建虚拟线程,在虚拟线程中完成web响应
- 相比前面三篇的动手实战,本篇主要在阅读quarkus源码,略显枯燥,尽管已尽量用图来辅助理解,但是读源码就是这样,不但捷径很少,岔路还特别多,好在咱们一路咬牙坚持下来了,收获也不会少
- 下一篇文章就是整个系列的终篇了,相比本文,终篇会简单很多,大家一起在轻松的氛围中畅谈线程技术的一个重要成员:ThreadLocal,看它在虚拟线程时代如何兴风作浪
学习路上,你不孤单,欣宸原创一路相伴...
经验总结扩展阅读
- LAL v0.32.0发布,更好的支持纯视频流
- ipadmini6屏幕刷新率_ipadmini6支持120刷新率吗
- ubantu18.04@Intel 82545EM 【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机
- iphone5g手机有哪些 哪些手机支持5g
- ipadpencil一代支持机型 支持ipadpencil一代的机型有哪些
- 一加AcePro有红外线吗 一加AcePro支持红外功能吗
- 一加AcePro支持无线充电吗 一加AcePro有无线充电功能吗
- 一加AcePro支持nfc功能吗 一加AcePro有nfc功能吗
- 华为freebudspro2支持音频连接中心吗 有音频连接中心吗
- opporeno5有没有nfc功能 oppo支持nfc功能吗
