Java không có cách dừng cưỡng bức an toàn. Cơ chế chính thức là hợp tác (cooperative): gửi tín hiệu, thread tự thoát ở điểm nó chọn.
Thread.stop() bị deprecate từ lâu và nay ném UnsupportedOperationException vì nó nhả toàn bộ monitor mà thread đang giữ ngay lập tức. Dữ liệu đang được sửa dở trong khối synchronized bị lộ ra cho thread khác ở trạng thái không nhất quán, và không có cách nào bắt lỗi đó.
Cách đúng — dùng interrupt() và kiểm tra cờ:
while (!Thread.currentThread().isInterrupted()) {
try {
Item item = queue.take(); // ném InterruptedException khi bị interrupt
process(item);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // đặt lại cờ rồi thoát
break;
}
}Hai lỗi thường gặp: nuốt InterruptedException bằng khối catch rỗng — cờ interrupt bị xoá khi exception được ném, không đặt lại là các tầng trên mất tín hiệu huỷ; và dùng cờ boolean thường thay vì volatile boolean, khiến thread có thể không bao giờ thấy giá trị mới.
Với thread pool, shutdownNow() chính là gửi interrupt tới các worker.