Cùng tìm hiểu cách chạy mỗi nhiệm vụ trong một luồng ảo bằng
Executors.newVirtualThreadPerTaskExecutor() (Java 21), khác gì so với các pool cổ điển (
newFixedThreadPool,
newCachedThreadPool), cách kết thúc đúng bằng
shutdown() và
awaitTermination(...), lấy kết quả nhiệm vụ qua
Future, và nơi luồng ảo mang lại lợi ích lớn nhất (I/O quy mô lớn, máy chủ web, kiểm thử tải). Cuối cùng — các lỗi thường gặp và lưu ý.