1、为什么需要虚拟线程
- Java 中的线程是对操作系统线程的一个简单包装,线程的创建,调度和销毁等都是由操作系统完成;
- Java线程和系统线程是一一对应的关系;
- 线程切换需要消耗 CPU 时间,这部分时间是与业务无关的;
- 线程的性能直接受操作系统处理能力的影响;
- 因此,通过线程的特点可以发现线程是一种重量级的资源
在 JDK 19 源码中,官方直接在 java.lang 包下新增一个 VirtualThread 类来表示虚拟线程,和现有的 Thread类并驾齐驱
对于虚拟线程的创建,官方给出了4种常见的方式
通过 Thread.startVirtualThread()可以创建一个新的并且已启动的虚拟线程
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
// 创建并且启动虚拟线程
Thread.startVirtualThread(customThread);
}
}
class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
通过Thread.ofVirtual()创建
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
// 创建并且不启动虚拟线程,然后 unStarted.start()方法启动虚拟线程
Thread unStarted = Thread.ofVirtual().unstarted(customThread);
unStarted.start();
// 等同于
Thread.ofVirtual().start(customThread);
}
}
class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
通过ThreadFactory创建
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
// 获取线程工厂类
ThreadFactory factory = Thread.ofVirtual().factory();
// 创建虚拟线程
Thread thread = factory.newThread(customThread);
// 启动线程
thread.start();
}
}
class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
通过Executors.newVirtualThreadPerTaskExecutor()创建
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(customThread);
}
}
class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}