目錄
一、定義與特性
?二、虛擬線程實現
2.1 使用 Thread.startVirtualThread() 創建
2.2 使用 Thread.ofVirtual() 創建
2.3 使用 ThreadFactory 創建
2.4 使用 Executors.newVirtualThreadPerTaskExecutor()創建
三、虛擬線程和普通線程的區別
3.1 線程管理方式不同
3.2 創建成本不同
3.3 并發編程模型的簡化
3.4 阻塞操作的影響
一、定義與特性
定義:
? ? ? ? (1)虛擬線程是
Java19
提出來的一個概念,Java19
提供特性預覽,開放實裝是Java21。
? ? ? ? (2)虛擬線程是一種由JVM而非操作系統直接管理的線程。它獨立于操作系統。虛擬線程是依附于主線程的,如果主線程銷毀了,虛擬線程也不復存在。
特性(優點):
????????1.輕量級:虛擬線程的創建和銷毀代價極低,與傳統線程相比內存占用少。
????????2.高并發:支持數百萬級別的并發進程,不會因線程數量限制系統性能。
????????3.與傳統線程兼容:完全兼容現有的線程API,無需修改代碼即可引入虛擬線程。
缺點:
? ? ? ? 1.不適用于計算密集型任務:虛擬線程適用于I/O密集型任務,但不適用于計算密集型任務,因為密集型計算始終需要CPU資源作為支持。
? ? ? ? 2.與某些第三方庫不兼容。
?二、虛擬線程實現
虛擬線程的使用和普通線程幾乎一樣,唯一的區別在于創建虛擬線程只能通過特定的方法。
在SpringBoot中使用虛擬線程要求SpringBoot的版本最低是?
3.x
?,JDK的版本不能低于21
2.1 使用 Thread.startVirtualThread()
創建
直接通過Thread靜態方法創建,該方式無法指定線程名稱,線程名稱默認為:null
@Testvoid testVirtualThread4() {Thread.startVirtualThread(() -> System.out.printf("線程ID:%s - 任務執行完成", Thread.currentThread().threadId())) ;}
2.2 使用 Thread.ofVirtual()
創建
ofVirtual()方法創建的
虛擬線程默認是自動執行的,可創建不自動啟動的線程,手動執行。
@Testvoid testVirtualThread2() {// 創建虛擬線程并自動執行Thread.Builder.OfVirtual virtual = Thread.ofVirtual().name("pack1");virtual.start(() -> System.out.printf("%s - VirtualThread1自動執行任務完成\n", Thread.currentThread().getName()));// 創建不自動啟動的線程Thread thread = virtual.unstarted(() -> System.out.printf("%s - VirtualThread1手動執行任務完成\n", Thread.currentThread().getName()));// 手動啟動虛擬線程thread.start();}
2.3 使用 ThreadFactory
創建
@Testvoid testVirtualThread3() {ThreadFactory threadFactory = Thread.ofVirtual().name("threadFactory").factory();threadFactory.newThread(() -> System.out.printf("%s - 通過工廠創建執行任務完成", Thread.currentThread().getName())).start();}
2.4 使用 Executors.newVirtualThreadPerTaskExecutor()
創建
創建一個執行器,為每個任務啟動一個新的虛擬線程
@Testvoid testVirtualThread1() {try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));System.out.println(STR."task: \{i}");return i;}));}}
三、虛擬線程和普通線程的區別
3.1 線程管理方式不同
- 虛擬線程:虛擬線程由JVM管理,少量映射到操作系統線程上,實現輕量化,避免了直接依賴操作系統的線程創建、調度和銷毀開銷。
- 普通線程:傳統的線程是由操作系統直接管理的,每創建一個線程都會占用系統資源,并由操作系統負責調度。
3.2 創建成本不同
- 虛擬線程:創建成本低,因為不需要操作系統的參與,大多數管理工作由JVM來完成。
- 普通線程:創建成本比較高,每個線程都會占用一部分操作系統的資源,如:內存和CPU,并且需要頻繁的上下文切換。
3.3 并發編程模型的簡化
- 虛擬線程:虛擬線程輕量高效,無需復雜線程池管理,每個任務可直接分配獨立線程執行。
- 普通線程:傳統線程開銷大,通常需線程池優化,避免頻繁創建銷毀。
3.4 阻塞操作的影響
- 虛擬線程:虛擬線程能高效處理阻塞操作,JVM可輕量掛起阻塞線程并調度其他任務,幾乎無系統壓力。
- 普通線程:阻塞操作會導致線程掛起,高并發時可能耗盡系統資源。