支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程( 四 )


文章插图

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

支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

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

支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

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

支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

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

支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

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

支持JDK19虚拟线程的web框架之四:看源码,了解quarkus如何支持虚拟线程

文章插图
  • 至此,quarkus支持虚拟线程的相关代码已经阅读完毕,这里再做个小结:
  1. 咱们在web接口类上添加的@RunOnVirtualThread注解,会存入每个web接口方法对应的ResourceMethod对象中
  2. 应用在初始化的时候,检查web接口方法对应的ResourceMethod对象,如果需要在虚拟线程中响应,就给这个web接口绑定一个BlockingHandler对象,此对象有个成员变量,是个executor,是通过Executors.newVirtualThreadPerTaskExecutor()方法创建的
  3. web请求到达时,web接口方法的handler对象会被拿来执行其handler方法,BlockingHandler也是其中之一
  4. BlockingHandler的handler方法中,会使用executor.execute方法来执行web响应逻辑,此方法会创建创建虚拟线程,在虚拟线程中完成web响应
  • 相比前面三篇的动手实战,本篇主要在阅读quarkus源码,略显枯燥,尽管已尽量用图来辅助理解,但是读源码就是这样,不但捷径很少,岔路还特别多,好在咱们一路咬牙坚持下来了,收获也不会少
后面更精彩
  • 下一篇文章就是整个系列的终篇了,相比本文,终篇会简单很多,大家一起在轻松的氛围中畅谈线程技术的一个重要成员:ThreadLocal,看它在虚拟线程时代如何兴风作浪
欢迎关注博客园:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...

经验总结扩展阅读