这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
看源码的第一步,咱们先弄明白一个重要参数:isDefaultBlocking,因为后面的源码阅读有好几处都会用到
关于isDefaultBlocking,其来源是接口RequestContextFactory,如下图,接口的isDefaultBlocking方法,默认返回是false
刚才说好的兵分两路,先看VIRTUAL_EXECUTOR_SUPPLIER是什么,再看RuntimeDeploymentManager#deploy()方法
该方法内容很多,咱们还是只看虚拟线程有关的,如下图,VIRTUAL_EXECUTOR_SUPPLIER成了runtimeResourceDeployment的成员变量,然后针对每个bean的每个方法,都要执行一次箭头4指向的buildResourceMethod方法,此方法是关键,接下来重点看
至此就要先打住了,不要急着看BlockingHandler的代码,那里面的东西是在处理web请求时才会执行,到目前为止咱们的重点还只是分析Executors.newVirtualThreadPerTaskExecutor()方法创建的executor去了哪里,现在就小结一下吧
一图胜千言,本篇最核心的Executor对象的诞生过程,由一个主线逻辑和两个支线逻辑组成,如下图,红色代表主线任务,它负责遍历所有web接口对应的方法,发现该方法需要用虚拟线程执行时,就为此方法绑定一个BlockingHandler对象,这个handler的成员变量中,就有直线逻辑用JDK19特定的方法创建出来的虚拟线程特有的executor对象,至于这个handler对象怎么用?就是本篇的另一半重要内容了:执行虚拟线程
上面的代码其实就是调用hanler的handle方法,所以,是时候去看那个BlockingHandler的handler方法了
刚打开代码就大呼一声痛快!如下图,handler将虚拟线程的executor和web请求的上下文对象requestContext串起来了,接下来该去箭头2所指的resume中一探究竟,我这里大胆的猜一下,resume方法中要做的事情应该和Runnable有关,理由很简单:Runnable和Executor不就是配合着用的嘛
参与评论
手机查看
返回顶部