在Java 21中,引入了虚拟线程(Virtual Threads)作为新的特性
以下是几种创建和使用虚拟线程的方法:
1.使用 Thread.startVirtualThread() 方法
// 定义一个Runnable任务
Runnable task = () -> {
// 在这里放置你的任务代码
System.out.println("虚拟线程正在执行任务...");
};
// 直接使用Thread类的静态方法startVirtualThread来创建并启动一个虚拟线程
Thread.startVirtualThread(task);
注释: 此方法最简洁,直接传入一个实现了Runnable接口的对象,代表了线程需要执行的任务。
2.使用虚拟线程工厂创建未启动的线程
// 创建一个虚拟线程工厂
Thread.VirtualThreadFactory factory = Thread.ofVirtual();
// 使用工厂创建一个未启动的虚拟线程
Thread virtualThread = factory.unstarted(() -> {
// 在这里放置你的任务代码
System.out.println("虚拟线程由工厂创建并即将启动...");
});
// 手动启动线程
virtualThread.start();
注释: 通过虚拟线程工厂,可以对线程的一些属性进行配置,比如线程名前缀、是否为守护线程等,然后通过unstarted方法创建线程实例但不立即启动,最后调用start()方法启动线程。
3.通过虚拟线程工厂创建并启动线程
// 创建虚拟线程工厂并立即定义任务
Thread virtualThread = Thread.ofVirtual().factory().newThread(() -> {
// 在这里放置你的任务代码
System.out.println("通过虚拟线程工厂直接创建并启动线程...");
});
// 启动线程
virtualThread.start();
注释: 这种方式也是使用工厂创建虚拟线程,但相比上一个例子,这里直接链式调用了factory()和newThread(),并且立即启动了线程。
4.使用基于虚拟线程的ExecutorService
// 创建一个基于虚拟线程的ExecutorService
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
// 提交任务到ExecutorService,它会为每个任务创建一个新的虚拟线程
executor.submit(() -> {
// 在这里放置你的任务代码
System.out.println("任务通过ExecutorService提交至虚拟线程执行...");
});
// 最后记得关闭ExecutorService以释放资源
executor.shutdown();
// 启动线程
virtualThread.start();
注释: 使用Executors.newVirtualThreadPerTaskExecutor()创建的ExecutorService能够自动管理虚拟线程池,对于每个提交的任务都会在一个新的虚拟线程上执行。记得在所有任务完成之后调用shutdown()来关闭服务。