名词
平台线程
:Java传统java.lang.Thread 实例线程概念虚拟线程
:JDK19后引入的新的线程概念,不独占底层操作系统线程,为解决高吞吐量、高并发场景由JDK创新调度的虚拟线程。
平台线程和虚拟线程
虚拟线程----M:N—平台线程—1:1----操作系统线程
平台线程
的调度依赖于操作系统中的调度程序。虚拟线程
的调度线程由JDK自己的调度程序调试, JDK的调度程序不是直接将虚拟线程分配给处理器,而是将虚拟线程分配给平台线程。- 被调度程序分配的平台线程是虚拟线程的载体,但调度程序不维护两者间的关联,即虚拟线程在其生命周期内会挂载在不同的载体上,多个虚拟线程会被调度到多个平台线程,即M:N调试
- 平台线程是操作系统线程的包装器实现(1:1调度), 即一个平台线程对应操作系统的一个线程,平台线程数受限于操作系统的线程数。虚拟线程采用 M:N 调度,其中大量 (M) 的虚拟线程计划在较少数量的 (N) 个操作系统线程上运行。
- 平台线程和虚拟线程的堆栈是分开的,双方看不到对方的堆栈中的局部变量
线程池化
- 平台线程的创建非常一般使用线程池的方式使用。
- 虚拟线程的创建非常便宜,永远不需要池化它们。
线程使用
线程创建方式
- 平台线程
//ofPlatform方式
Thread.ofPlatform().start(()->{
System.out.println(Thread.currentThread());
});
- 虚拟线程使用
//ofVirtual方式
Thread.ofVirtual().start(()->{
System.out.println(Thread.currentThread());
});
//Executors方式
var executorService = Executors.newVirtualThreadPerTaskExecutor();
executorService.execute(() -> {
System.out.println(Thread.currentThread());
});
//startVirtualThread方式
Thread.startVirtualThread(() -> {
Thread current = Thread.currentThread();
System.out.println(current);
System.out.println(current.isVirtual());
});
- isVirtual判断是否是虚拟线程
Thread current = Thread.currentThread();
System.out.println(current.isVirtual());
springboot3使用虚拟线程
- 配置启动虚拟线程
spring:
thread-executor: virtual #启动虚拟线程的必须配置
- 应用
@EnableAsync
在Spring应用程序中启用异步方法的支持
@EnableAsync
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 通过将
@Async
注解应用于方法上,可以将该方法标记为一个异步方法
@Service
public class AsyncService {
private static final Log log = LogFactory.getLog(AsyncService.class);
@Async
public void doSomething(CountDownLatch countDownLatch) {
log.info(Thread.currentThread());
try {
Thread.sleep(50);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
countDownLatch.countDown();
}
}