Java Virtual Threads

0 0 0

Người đăng: Tung Bui

Theo Viblo Asia

Concurrency (tính đồng thời) từ lâu đã là một trong những vấn đề phức tạp và quan trọng trong phát triển phần mềm, đặc biệt là khi làm việc với các hệ thống cần xử lý nhiều tác vụ cùng lúc, chẳng hạn như server, ứng dụng web, hay các hệ thống phân tán.

Các phương pháp truyền thống như sử dụng threads trong Java đã tồn tại từ rất lâu nhưng gặp phải một số hạn chế lớn, đặc biệt là khi số lượng threads tăng lên. Điều này dẫn đến việc sử dụng tài nguyên không hiệu quả và gặp phải những vấn đề như overhead lớn trong quản lý threads.

Java 21 giới thiệu Virtual Threads, một tính năng mới mà theo các chuyên gia sẽ cách mạng hóa cách thức quản lý và thực thi concurrency trong Java. Tính năng này không chỉ giúp giảm bớt sự phức tạp mà còn nâng cao hiệu suất, đặc biệt là đối với các ứng dụng cần xử lý một lượng lớn tác vụ đồng thời.

1. Concurrency trong Java: Những thách thức truyền thống

Trước khi Java 21 giới thiệu Virtual Threads, Java đã sử dụng các threads (real threads) để thực hiện các tác vụ đồng thời. Threads được quản lý trực tiếp bởi hệ điều hành, với mỗi thread có không gian bộ nhớ riêng và được yêu cầu tạo lập bởi JVM.

Mặc dù cách này hoạt động tốt cho các ứng dụng có lượng threads tương đối nhỏ, nhưng khi số lượng threads tăng lên, bạn sẽ gặp phải những vấn đề nghiêm trọng:

  • Overhead tài nguyên: Mỗi thread cần một lượng tài nguyên nhất định (chẳng hạn như bộ nhớ cho stack) và khi số lượng threads tăng lên, overhead này có thể trở thành một vấn đề nghiêm trọng.
  • Quản lý threads phức tạp: Khi ứng dụng yêu cầu hàng nghìn hoặc thậm chí hàng triệu threads, việc quản lý và tối ưu hóa threads trở nên rất khó khăn. Việc này có thể dẫn đến hiệu suất kém và làm tăng độ phức tạp của hệ thống.
  • Block I/O: Trong các ứng dụng web hoặc hệ thống mạng, nhiều threads sẽ bị block khi thực hiện các tác vụ I/O, ví dụ như đọc/ghi file hoặc chờ phản hồi từ API. Từ đó có thể làm giảm hiệu suất nếu không được xử lý đúng cách.

2. Virtual Threads: Giải pháp từ Java 21

Virtual Threads trong Java 21 là một tính năng giúp giải quyết các vấn đề trên bằng cách cung cấp một mô hình thread mới nhẹ nhàng và hiệu quả hơn.

Virtual Threads là một dạng thread giả lập, được quản lý bởi JVM thay vì hệ điều hành. Chúng có chi phí thấp hơn rất nhiều so với threads truyền thống, cho phép bạn tạo hàng triệu threads mà không gặp phải vấn đề overhead lớn.

Cách hoạt động của Virtual Threads

Virtual Threads được tạo ra và quản lý bởi JVM thông qua một cơ chế được gọi là Fiber Scheduling. Mỗi Virtual Thread không yêu cầu một không gian bộ nhớ riêng biệt lớn như thread, mà thay vào đó chúng chia sẻ các resources của JVM, giúp tiết kiệm tài nguyên hệ thống với các tính chất sau:

  • Lightweight: Virtual Threads sử dụng một lượng tài nguyên rất nhỏ, giúp tiết kiệm bộ nhớ và giảm chi phí tạo lập.
  • Non-blocking I/O: Các Virtual Threads được thiết kế để hỗ trợ I/O không đồng bộ (non-blocking I/O). Khi một Virtual Thread thực hiện I/O (chẳng hạn như đọc từ file hoặc chờ API), nó không bị block, thay vào đó, JVM có thể chuyển sang thực thi các threads khác mà không làm gián đoạn hệ thống.
  • Scalable: Bạn có thể tạo ra hàng triệu Virtual Threads mà không gặp phải các vấn đề về hiệu suất hoặc tài nguyên, giúp các ứng dụng có khả năng mở rộng dễ dàng hơn.

Lợi ích của Virtual Threads

Sự ra đời của Virtual Threads như một cuộc cách tân dành cho những tín đồ Java trong việc quản lý luồng và đa tác vụ. Những lợi ích mà Virtual Threads mang lại thật sự rất khó từ chối hay bàn cải, điển hình như:

Hiệu suất cao hơn: Nhờ vào việc giảm overhead tài nguyên và quản lý threads hiệu quả hơn, Virtual Threads giúp cải thiện hiệu suất của các ứng dụng đồng thời.

Quản lý đơn giản hơn: Các Virtual Threads không yêu cầu lập trình viên phải quản lý từng thread một cách thủ công. Với Virtual Threads, JVM sẽ lo liệu tất cả công việc này, giúp giảm thiểu sự phức tạp trong việc quản lý concurrency.

Khả năng mở rộng: Virtual Threads giúp các ứng dụng mở rộng dễ dàng hơn khi cần xử lý hàng triệu yêu cầu đồng thời mà không gặp phải các vấn đề liên quan đến tài nguyên hệ thống.

Cải thiện độ phản hồi: Nhờ vào khả năng sử dụng non-blocking I/O, Virtual Threads giúp cải thiện thời gian phản hồi của ứng dụng, đặc biệt là trong các hệ thống web hoặc mạng.

3. Sử dụng Virtual Threads trong Java 21

Để sử dụng Virtual Threads trong Java 21, ta cần thay đổi cách tạo và quản lý threads trong ứng dụng của mình. Cách tạo Virtual Thread đơn giản hơn rất nhiều so với threads truyền thống.

Tạo Virtual Thread

Để tạo một Virtual Thread trong Java 21, ta có thể sử dụng Thread.ofVirtual().start():

Thread virtualThread = Thread.ofVirtual().start(() -> { System.out.println("Virtual thread is running!");
});

Trong ví dụ trên, một Virtual Thread mới được tạo ra và bắt đầu thực thi ngay lập tức, nó có thể thay thế cho các cách tạo thread truyền thống như:

Thread thread = new Thread(() -> { System.out.println("Real thread is running!");
});
thread.start();

Điều quan trọng cần lưu ý là Virtual Threads không cần phải lo lắng về việc sử dụng các ExecutorService hay ThreadPoolExecutor như với các thread. Java 21 hỗ trợ tích hợp Virtual Threads trong các API hiện tại của Java, giúp việc chuyển đổi sang sử dụng Virtual Threads dễ dàng hơn.

Sử dụng Virtual Threads với ExecutorService

Java 21 cho phép sử dụng Virtual Threads với ExecutorService. Để tạo một ExecutorService sử dụng Virtual Threads, ta có thể làm như sau:

ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
executorService.submit(() -> { System.out.println("Virtual thread in ExecutorService is running!");
});

Khi sử dụng Executors.newVirtualThreadPerTaskExecutor(), mỗi task được gửi đến executorService sẽ được thực thi trong một Virtual Thread mới, giúp đơn giản hóa việc quản lý concurrency trong ứng dụng.

4. Ví dụ thực tế về Virtual Threads

Để hiểu rõ hơn cách sử dụng Virtual Threads, hãy xem xét một ví dụ thực tế.

Giả sử bạn đang phát triển một ứng dụng server có hàng nghìn kết nối đồng thời. Thay vì tạo ra một thread cho mỗi kết nối, bạn có thể sử dụng Virtual Threads để xử lý chúng một cách hiệu quả.

import java.util.concurrent.*; public class VirtualThreadExample { public static void main(String[] args) { ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor(); for (int i = 0; i < 1000; i++) { final int connectionId = i; executorService.submit(() -> { // Xử lý kết nối System.out.println("Handling connection " + connectionId + " in Virtual Thread"); }); } executorService.shutdown(); }
}

Trong ví dụ trên, ứng dụng tạo ra 1000 Virtual Threads để xử lý các kết nối đồng thời. Với Virtual Threads, việc này không làm giảm hiệu suất, bởi vì chúng không tiêu tốn quá nhiều tài nguyên như threads .

5. Lưu ý

Mặc dù Virtual Threads mang lại nhiều lợi ích, nhưng vẫn có một số điều cần lưu ý khi sử dụng chúng:

  • Không thích hợp cho mọi trường hợp: Virtual Threads là lý tưởng cho các ứng dụng cần xử lý nhiều tác vụ đồng thời mà không yêu cầu sử dụng quá nhiều tài nguyên. Tuy nhiên, đối với các tác vụ tính toán nặng (CPU-bound), Virtual Threads có thể không phải là lựa chọn tối ưu.
  • Đồng bộ hóa: Vì Virtual Threads chạy đồng thời, việc đồng bộ hóa giữa các thread vẫn là điều cần phải chú ý. Ta vẫn phải đảm bảo việc sử dụng các cơ chế đồng bộ như synchronized, ReentrantLock nếu có sự chia sẻ tài nguyên giữa các threads.

Lời kết

Virtual Threads trong Java 21 là một cải tiến lớn đối với việc quản lý concurrency trong Java. Chúng giúp tiết kiệm tài nguyên, cải thiện hiệu suất và làm giảm độ phức tạp trong việc quản lý hàng triệu tác vụ đồng thời. Với tính năng này, Java có thể dễ dàng đáp ứng nhu cầu của các ứng dụng web, hệ thống mạng, hoặc bất kỳ hệ thống nào yêu cầu xử lý đồng thời.

Bằng cách sử dụng Virtual Threads, lập trình viên có thể tận dụng sức mạnh của concurrency mà không gặp phải các vấn đề về overhead tài nguyên và quản lý threads phức tạp.

Java 21 đã đưa concurrency trong Java lên một tầm cao mới, giúp các ứng dụng Java trở nên mạnh mẽ và hiệu quả hơn bao giờ hết.

Bài viết mang tính chất "ghi chú, lưu trữ, chia sẻ và phi lợi nhuận".
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!

Happy coding! 😎 👍🏻 🚀 🔥

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 302

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 278

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 51

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 194

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 71

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139