当前位置: 首页 > article >正文

SpringMVC 笔记篇

2.1 ForkJoinPool底层原理分析

2.1.1 JDK19中的虚拟线程

首先注意要把项目切换成JDK19

首先我们这里有两个线程,一个是newFixedThreadPool,就是一个普通的线程池,另一个是我们的虚拟线程newVirtualThreadPerTaskExecutor。这里只有一个线程(newFixedThreadPool(1)),主线程等待时间为5秒。

MyTask类的代码如图所示

 那么它们两个有什么区别呢,我们把newVirtualThreadPerTaskExecutor注释掉,然后来run一下,下图是newFixedThreadPool的运行结果

我们可以看到这个任务是一秒执行一次,看运行结果中的时间51:01,51:02

下面我们切换为newVirtualThreadPerTaskExecutor虚拟线程来试一下

我们可以看到这五个任务执行的时间差不多就在同一秒,所以我们虚拟线程达到的一个效果就是,我们虽然只有一个线程(从上面运行结果可以看出来,线程名就是runnable@ForkJoinPool-1-worker-1),但是可以做到同时执行这五个任务。而不是像newFixedThreadPool这个普通线程一样,虽然只有一个线程但是还是要一个任务一个任务来执行。

2.1.2 newVirtualThreadPerTaskExecutor如何使用的ForkJoinPool 

 我们跟进一下newVirtualThreadPerTaskExecutor()方法,可以看到下图

这个方法里面有一个线程工厂ThreadFactory,在newThreadPerTaskExecutor()方法上继续跟进

在create()方法上跟进

 这里面最关键的就是虚拟工厂,这是专门用来创建线程的,也就是第一个截图中的ThreadFactory factory = Thread.ofVirtual().factory();这行代码,我们深入研究一下。

在factory()方法上跟进,然后点左边图标

 

在VirtualThreadFactory上面继续跟进

 

这里会把VirtualThreadFactory这个虚拟线程工厂给构造出来,后面的代码就会调用这个工厂来创建虚拟线程,我们在main方法中提交一个任务的时候,它就会去调用newThread(),可以根据下面贴出的源码来理解。

 


http://www.kler.cn/a/282286.html

相关文章:

  • Redis基础篇
  • 消息队列原理面试题及参考答案
  • 前端Javascript、Vue、CSS等场景面试题目(二)
  • ISP是什么?
  • html + css 自适应首页布局案例
  • 数据分析-Excel基础操作
  • Unity 贴图拷贝与性能对比
  • 【SpringCloud Alibaba】(八)学习 Sentinel 核心技术与配置规则(下)
  • Spring的单例模式
  • C# list根据动态字段排序
  • 【目标检测】YOLOV2
  • 信息安全(密码学)---数字证书、kpi体系结构、密钥管理、安全协议、密码学安全应用
  • 基于my Batis优化图书管理系统(二)
  • MySQL笔记(大斌)
  • linux-centos7 服务器上redis服务已经启动,但是宿主机无法访问,报错:connect timeout
  • MT5016A-ASEMI无人机专用整流桥MT5016A
  • 鸿蒙上架流程
  • 【WPF】WPF学习路线
  • Python-MNE-源空间和正模型03:自动源配准的方法
  • 鸿蒙开发入门day15-焦点事件
  • 【亲测有效】icmp,tcpping工具源码
  • 关于vue2运行时filemanager-webpack-plugin报错isFile is undefind
  • mysql数据库数据的批量插入
  • js传递long类型存在精度丢失
  • SpringBoot日志管理 —— 解决Logback生成 “LOG_PATH_IS_UNDEFINED“ 文件夹问题
  • webpack4手动搭建Vue项目