Thực hành đa luồng một cách bài bản: chuyển giao tác vụ cho
ExecutorService thay vì tự tạo
Thread, quản lý pool, hàng đợi và vòng đời (
shutdown(),
shutdownNow()). Phân tích sự khác nhau giữa
Runnable và
Callable<T>, lấy kết quả qua
Future và các phương thức của nó (
get(),
isDone(),
cancel(...),
isCancelled()). Trình diễn cách chạy nhiều tác vụ,
invokeAll/
invokeAny, xử lý
ExecutionException và các lỗi điển hình.