---
title: èæçº¿ç¨æç®å
¥é¨
category: Java
tag:
- Javaå¹¶å
---
> æ¬æé¨åå
容æ¥èª [Lorin](https://github.com/Lorin-github) ç[PR](https://github.com/Snailclimb/JavaGuide/pull/2190)ã
èæçº¿ç¨å¨ Java 21 æ£å¼åå¸ï¼è¿æ¯ä¸é¡¹ééçº§çæ´æ°ã
## ä»ä¹æ¯èæçº¿ç¨ï¼
èæçº¿ç¨ï¼Virtual Threadï¼æ¯ JDK è䏿¯ OS å®ç°çè½»é级线ç¨(Lightweight Processï¼LWPï¼ï¼ç± JVM è°åº¦ã许å¤èæçº¿ç¨å
±äº«åä¸ä¸ªæä½ç³»ç»çº¿ç¨ï¼èæçº¿ç¨çæ°éå¯ä»¥è¿å¤§äºæä½ç³»ç»çº¿ç¨çæ°éã
## èæçº¿ç¨åå¹³å°çº¿ç¨æä»ä¹å
³ç³»ï¼
å¨å¼å
¥èæçº¿ç¨ä¹åï¼`java.lang.Thread` å
å·²ç»æ¯ææè°çå¹³å°çº¿ç¨ï¼Platform Threadï¼ï¼ä¹å°±æ¯æ²¡æèæçº¿ç¨ä¹åï¼æä»¬ä¸ç´ä½¿ç¨ç线ç¨ãJVM è°åº¦ç¨åºéè¿å¹³å°çº¿ç¨ï¼è½½ä½çº¿ç¨ï¼æ¥ç®¡çèæçº¿ç¨ï¼ä¸ä¸ªå¹³å°çº¿ç¨å¯ä»¥å¨ä¸åçæ¶é´æ§è¡ä¸åçèæçº¿ç¨ï¼å¤ä¸ªèæçº¿ç¨æè½½å¨ä¸ä¸ªå¹³å°çº¿ç¨ä¸ï¼ï¼å½èæçº¿ç¨è¢«é»å¡æçå¾
æ¶ï¼å¹³å°çº¿ç¨å¯ä»¥åæ¢å°æ§è¡å¦ä¸ä¸ªèæçº¿ç¨ã
èæçº¿ç¨ãå¹³å°çº¿ç¨åç³»ç»å
æ ¸çº¿ç¨çå
³ç³»å¾å¦ä¸æç¤ºï¼å¾æºï¼[How to Use Java 19 Virtual Threads](https://medium.com/javarevisited/how-to-use-java-19-virtual-threads-c16a32bad5f7)ï¼ï¼

å
³äºå¹³å°çº¿ç¨åç³»ç»å
æ ¸çº¿ç¨ç对åºå
³ç³»å¤æä¸ç¹ï¼å¨ Windows å Linux çä¸»æµæä½ç³»ç»ä¸ï¼Java 线ç¨éç¨çæ¯ä¸å¯¹ä¸ççº¿ç¨æ¨¡åï¼ä¹å°±æ¯ä¸ä¸ªå¹³å°çº¿ç¨å¯¹åºä¸ä¸ªç³»ç»å
æ ¸çº¿ç¨ãSolaris ç³»ç»æ¯ä¸ä¸ªç¹ä¾ï¼HotSpot VM å¨ Solaris 䏿¯æå¤å¯¹å¤åä¸å¯¹ä¸ãå
·ä½å¯ä»¥åè R 大çåç: [JVM ä¸ççº¿ç¨æ¨¡åæ¯ç¨æ·çº§çä¹ï¼](https://www.zhihu.com/question/23096638/answer/29617153)ã
## èæçº¿ç¨æä»ä¹ä¼ç¹å缺ç¹ï¼
### ä¼ç¹
- é常轻é级ï¼å¯ä»¥å¨å个线ç¨ä¸å建æç¾ä¸å个èæçº¿ç¨èä¸ä¼å¯¼è´è¿å¤ç线ç¨å建åä¸ä¸æåæ¢ã
- ç®å弿¥ç¼ç¨ï¼ èæçº¿ç¨å¯ä»¥ç®å弿¥ç¼ç¨ï¼ä½¿ä»£ç æ´æäºçè§£åç»´æ¤ãå®å¯ä»¥å°å¼æ¥ä»£ç ç¼å徿´å忥代ç ï¼é¿å
äºåè°å°ç±ï¼Callback Hellï¼ã
- åå°èµæºå¼éï¼ ç¸æ¯äºæä½ç³»ç»çº¿ç¨ï¼èæçº¿ç¨çèµæºå¼éæ´å°ãæ¬è´¨ä¸æ¯æé«äºçº¿ç¨çæ§è¡æçï¼ä»èåå°çº¿ç¨èµæºçå建åä¸ä¸æåæ¢ã
### 缺ç¹
- ä¸éç¨äºè®¡ç®å¯éåä»»å¡ï¼ èæçº¿ç¨éç¨äº I/O å¯éåä»»å¡ï¼ä½ä¸éç¨äºè®¡ç®å¯éåä»»å¡ï¼å 为å¯éå计ç®å§ç»éè¦ CPU èµæºä½ä¸ºæ¯æã
- ä¾èµäºè¯è¨æåºçæ¯æï¼ åç¨éè¦ç¼ç¨è¯è¨æåºæä¾æ¯æã䏿¯ææç¼ç¨è¯è¨é½åçæ¯æåç¨ãæ¯å¦ Java å®ç°çèæçº¿ç¨ã
## åç§å建èæçº¿ç¨çæ¹æ³
Java 21 å·²ç»æ£å¼æ¯æèæçº¿ç¨ï¼å¤§å®¶å¯ä»¥å¨å®ç½ä¸è½½ä½¿ç¨ï¼å¨ä½¿ç¨ä¸å®æ¹ä¸ºäºéä½ä½¿ç¨é¨æ§ï¼å°½éå¤ç¨åæç `Thread` ç±»ï¼è®©å¤§å®¶å¯ä»¥æ´å å¹³æ»ç使ç¨ã
宿¹æä¾äºä»¥ä¸åç§æ¹å¼å建èæçº¿ç¨ï¼
1. ä½¿ç¨ `Thread.startVirtualThread()` å建
2. ä½¿ç¨ `Thread.ofVirtual()` å建
3. ä½¿ç¨ `ThreadFactory` å建
#### ä½¿ç¨ Thread.startVirtualThread()å建
```java
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
Thread.startVirtualThread(customThread);
}
}
static class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
```
#### ä½¿ç¨ Thread.ofVirtual()å建
```java
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
// å建ä¸å¯å¨
Thread unStarted = Thread.ofVirtual().unstarted(customThread);
unStarted.start();
// åå»ºç´æ¥å¯å¨
Thread.ofVirtual().start(customThread);
}
}
static class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
```
#### ä½¿ç¨ ThreadFactory å建
```java
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();
}
}
static class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
```
#### ä½¿ç¨ Executors.newVirtualThreadPerTaskExecutor()å建
```java
public class VirtualThreadTest {
public static void main(String[] args) {
CustomThread customThread = new CustomThread();
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(customThread);
}
}
static class CustomThread implements Runnable {
@Override
public void run() {
System.out.println("CustomThread run");
}
}
```
## èæçº¿ç¨åå¹³å°çº¿ç¨æ§è½å¯¹æ¯
éè¿å¤çº¿ç¨åèæçº¿ç¨çæ¹å¼å¤çç¸åçä»»å¡ï¼å¯¹æ¯å建çç³»ç»çº¿ç¨æ°åå¤çèæ¶ã
**说æ**ï¼ç»è®¡å建çç³»ç»çº¿ç¨ä¸é¨å为åå°çº¿ç¨ï¼æ¯å¦ GC 线ç¨ï¼ï¼ä¸¤ç§åºæ¯ä¸é½ä¸æ ·ï¼æä»¥å¹¶ä¸å½±å对æ¯ã
**æµè¯ä»£ç **ï¼
```java
public class VirtualThreadTest {
static List