jdk21虚拟线程
1、简述
在 JDK 21 中,虚拟线程(Virtual Threads)已经成为正式特性,通过 java.lang.Thread
的 ofVirtual()
方法可以创建虚拟线程。以下是使用虚拟线程的简单示例代码,展示如何在 JDK 21 中使用虚拟线程来执行并发任务。
2、代码demo
package com.ybw.thread.virtual;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 虚拟线程示例
*
* @author ybw
* @version V1.0
* @className VirtualThreadDemo
* @date 2025/2/21
**/
@Slf4j
public class VirtualThreadDemo {
public static void main(String[] args) throws InterruptedException {
// 创建一个虚拟线程池(使用 Executors.newVirtualThreadPerTaskExecutor())
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
// 提交多个任务到虚拟线程池
for (int i = 0; i < 10; i++) {
int taskNumber = i;
executorService.submit(() -> {
// 模拟耗时任务
log.info("Task {} is running on thread: {}", taskNumber, Thread.currentThread());
try {
// 模拟耗时操作
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.info("Task {} was interrupted.", taskNumber);
}
log.info("Task {} completed.", taskNumber);
});
}
//等待线程执行结束
TimeUnit.DAYS.sleep(1);
// 关闭线程池
executorService.shutdown();
}
}
}
代码说明:
-
虚拟线程池:
-
使用
Executors.newVirtualThreadPerTaskExecutor()
创建一个虚拟线程池。每次提交任务时,线程池会自动创建一个新的虚拟线程来执行任务。 -
虚拟线程的创建和销毁开销极低,因此可以轻松处理大量并发任务。
-
-
任务执行:
-
每个任务通过
executorService.submit()
提交到线程池中。 -
在任务中,通过
Thread.currentThread()
可以获取当前执行任务的线程,它将是一个虚拟线程。
-
-
线程池关闭:
-
在所有任务完成后,调用
executorService.shutdown()
关闭线程池。
-
虚拟线程的优势
-
轻量级:虚拟线程的创建和销毁成本极低,适合处理高并发场景。
-
与现有代码兼容:虚拟线程完全兼容
java.lang.Thread
API,无需修改现有代码即可使用。 -
简化线程管理:通过虚拟线程池,可以轻松管理大量并发任务,而不会导致系统资源耗尽。