前言:虚拟线程是JDK21的新特性,废话不多说,直接上例子说明。
常规线程池demo:
1:新建一个线程任务,并且打印出当前线程信息,且线程睡眠一秒
2:创建一个固定线程数为1的线程池对象
3:查看执行结果
可见,通过线程睡眠一秒的方式,当前任务是串行执行完,切耗时3秒多。
虚拟线程池demo:
接下来我们在看看通过虚拟线程执行结果: 1:同样新建一个线程任务,并且打印出当前线程信息,且线程睡眠一秒
2:创建一个虚拟线程池对象
注意:我们在```
Executors.newVirtualThreadPerTaskExecutor();
这行代码的时候并没有可以设置执行线程核心数大小的,不然默认为CPU核心数,所以我们需要配置一些参数信息才能为虚拟线程池开启数量为一个核心线程数,这样才能看到效果,代码如下:
3:运行代码
可见,ForkJoinPool-1-worker-1一个载体线程开启了三个虚拟线程,#21,#23,#24,而且耗时1秒多,这下应该对虚拟线程有个大概的认识了
对比:
| 线程池类型 | 核心线程数大小 | 执行任务数 | 耗时 |
|---|---|---|---|
| 常规 | 1 | 3 | 3023ms |
| 虚拟 | 1 | 3 | 1035ms |
总结:虚拟线程数简单理解,就是比线程更小颗粒度的一个执行者,也就是可以被线程用来调度的更小单位,线程成为了虚拟线程的调度者(底层是通过操作ForkJoinPool来执行虚拟线程的调度),就例如我们上述代码中,我们的任务在睡眠的期间,这时候cpu处于空闲时间,这实话线程调度者会用来执行其他的任务,达到cpu的充分利用。由此,我们可以推出在IO密集型任务上,虚拟线程的意义是非常重大的,例如RPC网络io,文件磁盘io处理等。!!