Virtual threads là một dự án tham vọng trên nền tảng Java, được kì vọng sẽ cải thiện đáng kể cho các ứng dụng tải cao và là một trong những thay đổi lớn của kiến trúc JVM sau một thời gian dài. Những kì vọng với virtual threads trong Java 19 sẽ có trong bài viết này.
Một trong những cập nhật đáng chú ý của Java 19 chính là sự ra mắt của virtual thread. Đây được đánh giá là nền tảng mới cho ứng dụng Java quy mô lớn, hứa hẹn sẽ cải thiện hiệu năng cho các hệ thống tải lớn dựa trên Java, đặc biệt là các hệ thống cần xử lý song song nhiều.
Giải thích nhanh về Thread và Virtual Thread
Trong kiến trúc máy tính, thread (luồng) là phần con của process (tiến trình). Thread được tạo ra và quản lý thời gian xử lý bởi hệ điều hành.
Ngược lại, virtual thread (luồng ảo) là thread được tạo và quản lý bởi một platform thay vì được tạo và quản lý bởi hệ điều hành như thread thông thường. Một ví dụ điển hình nhất của virtual thread là goroutine của Golang.
Mới đây Java cũng đã cung cấp khả năng tạo virtual thread bằng JEP 425 trong JDK 19 với mã dự án Project Loom.
Do virtual thread được tạo ra bởi platform nên về lý thuyết platform có thể tạo ra số lượng virtual thread gần như vô tận, không bị giới hạn bởi số lượng thread của hệ điều hành. Ngoài ra tạo virtual thread cũng tốn ít tài nguyên hệ thống hơn thread thông thường nhiều lần, giúp cho việc tạo và quản lý virtual thread trở nên dễ dàng hơn.
Bảng dưới đây so sánh sự khác nhau về thread và virtual thread:
Threads | Virtual Threads |
---|---|
Được tạo ra và quản lý bởi hệ điều hành | Được tạo ra và quản lý bởi platform |
Tốn nhiều tài nguyên | Tốn ít tài nguyên |
Khó quản lý | Dễ quản lý |
Số lượng ít | Số lượng nhiều |
Phần tiếp theo ta sẽ tìm hiểu cách sử dụng tính năng virtual thread trong Java 19.
Sử dụng Virtual Threads trong Java
Đầu tiên, ta cần cài đặt JDK 19 từ Oracle hoặc OpenJDK.
Sau khi cài đặt JDK19 thành công, ta tạo file App.java như sau để test tính năng tạo virtual thread.
public class App { public static void main( String[] args ) { Random random = new Random(); Runnable runnable = () -> { double i = random.nextDouble(1000) % random.nextDouble(1000); }; int numThread = 100000; long start = System.currentTimeMillis(); for (int i = 0; i < numThread; i++) { Thread.startVirtualThread(runnable); } long finish = System.currentTimeMillis(); long timeElapsed = finish - start; System.out.println("Run time with virtual thread: " + timeElapsed); start = System.currentTimeMillis(); for (int i = 0; i < numThread; i++) { Thread t = new Thread(runnable); t.start(); } finish = System.currentTimeMillis(); timeElapsed = finish - start; System.out.println("Run time without virtual thread: " + timeElapsed); }
}
Do tính năng virtual thread còn đang ở mức preview nên cần chạy command java với option --enable-preview như sau:
java --source 19 --enable-preview ./App.java
Cấu hình máy test sử dụng windows 11 với CPU i7 8750H và 16GB RAM. Kết quả chạy như sau:
Run time with virtual thread: 488
Run time without virtual thread: 16652
Như ta thấy, trong Java việc sử dụng virtual thread hiệu quả hơn thread thường lên đến hơn 30 lần.
Một số vấn đề cần lưu ý
Việc tạo ra một virtual thread rất nhanh và hiệu quả so với thread thông thường, tuy nhiên hiệu suất tính toán trên virtual thread cũng chỉ tương đương trên thread thường. Vì vậy, sử dụng virtual thread chỉ có lợi khi chúng ta cần tạo ra một lượng lớn thread để làm các công việc ít tốn hiệu năng CPU, ví dụ như xử lý network, đọc/ghi file, truy vấn cơ sở dữ liệu. Việc sử dụng virtual thread cũng giúp hệ thống có thể vượt qua số lượng thread tối đa của hệ điều hành, vốn bị giới hạn bởi cấu hình phần cứng.
Hiện tại thì virtual thread trên Java vẫn chỉ là bản preview nên cần kích hoạt bằng option --enable-preview.
Kết luận
Virtual thread trong Java là một tính năng rất hữu ích, hứa hẹn sẽ đem lại nhiều thay đổi trong việc thiết kế và xây dựng các hệ thống dựa trên Java, đặc biệt là các hệ thống cần xử lý song song nhiều. Hiện tại một số dự án lớn trong hệ sinh thái Java đã bắt đầu sử dụng virtual thread như Quarkus, Tomcat, Helidon, ...