掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Java 中的虛擬線程,也叫做協(xié)程或“輕量級線程”,它誕生于 JDK 19(預(yù)覽 API),正式發(fā)布于 JDK 21,它是一種在 Java 虛擬機(jī)(JVM)層面實現(xiàn)的邏輯線程,不直接和操作系統(tǒng)的物理線程一一對應(yīng),因此它可以減少上下文切換所帶來的性能開銷。

操作系統(tǒng)線程、普通線程(Java 線程)和虛擬線程的關(guān)系如下:
圖片
虛擬線程的創(chuàng)建方式,主要有以下 4 種:
具體示例如下。
創(chuàng)建虛擬線程,并直接啟動執(zhí)行任務(wù):
// 創(chuàng)建并啟動虛擬線程
Thread.startVirtualThread(() -> {
System.out.println("Do virtual thread.");
});只創(chuàng)建虛擬線程,但不直接啟動:
// 創(chuàng)建虛擬線程
Thread vt = Thread.ofVirtual().unstarted(()->{
System.out.println("Do virtual thread.");
});
// 運(yùn)行虛擬線程
vt.start();先創(chuàng)建虛擬線程工廠,然后再使用工廠創(chuàng)建虛擬線程,之后再調(diào)用 start() 方法進(jìn)行執(zhí)行:
// 創(chuàng)建虛擬線程工廠
ThreadFactory tf = Thread.ofVirtual().factory();
// 創(chuàng)建虛擬線程
Thread vt = tf.newThread(()->{
System.out.println("Do virtual thread.");
});
// 運(yùn)行虛擬線程
vt.start();使用線程池的方式創(chuàng)建虛擬線程:
// 創(chuàng)建一個支持虛擬線程的線程池
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(()->{
System.out.println("Do virtual thread.");
});虛擬線程和普通線程的區(qū)別主要體現(xiàn)在以下幾點:
圖片
線程是輕量級的進(jìn)程,而虛擬線程則是輕量級的線程,虛擬線程是 JVM 層面實現(xiàn)的邏輯線程,不直接和操作系統(tǒng)的物理線程一一對應(yīng),因此使用它可以減少線程上下文切換所帶來的性能開銷。它和普通線程的線程類型也不同,普通線程是默認(rèn)是用戶線程類型,而虛擬線程則是守護(hù)線程(而且不能被修改)。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流