"Xin chào, Amigo! Bạn phải thừa nhận rằng ý tưởng Hủy bỏ của Ellie là tuyệt vời."

"Chuẩn rồi."

"Trên thực tế, có một thứ tương tự tồn tại trong lớp Thread . Chỉ có biến không được gọi là isCancel . Nó được gọi là isInterrupt . Và phương thức được sử dụng để dừng luồng không phải là cancel() . Nó làinterrupt() ."

"Thật sự?"

"Vâng. Kiểm tra xem:"

Mã số Sự miêu tả
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Bởi vì một số luồng có thể gọi phương thức chạy trên cùng một đối tượng Đồng hồ, nên chúng tôi lấy đối tượng Thread cho luồng hiện tại .

Lớp Đồng hồ ghi từ "Tick" vào bảng điều khiển mỗi giây một lần miễn là biến isInterrupt của luồng hiện tại là sai.

Khi isInterrupt trở thành true , phương thức chạy  sẽ kết thúc.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
Chuỗi chính bắt đầu một chuỗi con (đồng hồ) sẽ chạy mãi mãi.

Đợi 10 giây và  hủy tác vụ bằng cách gọi phương thức ngắt .

Chủ đề chính hoàn thành công việc của nó.

Kim đồng hồ kết thúc công việc của nó.

Hơn nữa, phương thức ngủ mà mọi người rất thích sử dụng trong các vòng lặp vô tận trong phương thức chạy sẽ tự động kiểm tra biến isInterrupt . Nếu một luồng gọi phương thức ngủ , trước tiên, phương thức này sẽ kiểm tra xem isInterrupt có đúng với luồng đó hay không. Nếu đó là sự thật, phương pháp sẽ không ngủ. Thay vào đó, nó ném ra một ngoại lệ InterruptedException .

"Tại sao lại ném một ngoại lệ? Sẽ tốt hơn nếu chỉ đặt isInterrupted() thay vì isCancel() trong một vòng lặp?"

" Đầu tiên , phương thức chạy không phải lúc nào cũng có vòng lặp. Phương thức này có thể chỉ bao gồm vài chục lệnh gọi đến các phương thức khác. Sau đó, bạn sẽ phải thêm kiểm tra isInterrupted trước mỗi lệnh gọi phương thức."

" Thứ hai , một số phương pháp liên quan đến nhiều hành động khác nhau có thể mất nhiều thời gian để thực thi."

" Thứ ba , việc ném một ngoại lệ không thay thế kiểm tra isInterrupted. Nó chỉ là một bổ sung thuận tiện. Ngoại lệ được ném cho phép bạn nhanh chóng hủy ngăn xếp cuộc gọi trở lại chính phương thức chạy. "

" Thứ tư , phương pháp ngủ được sử dụng rất nhiều. Hóa ra, phương pháp hữu ích này được tăng cường bởi một kiểm tra ngầm không kém phần hữu ích. Có vẻ như không ai cụ thể thêm kiểm tra, nhưng nó vẫn ở đó. Điều này cực kỳ có giá trị khi bạn đang sử dụng mã của người khác và bạn không thể tự thêm kiểm tra."

" Thứ năm , kiểm tra bổ sung không làm giảm hiệu suất. Gọi phương thức ngủ có nghĩa là luồng không nên làm bất cứ điều gì (ngoại trừ ngủ), vì vậy công việc bổ sung không làm phiền bất kỳ ai."

"Đó là những lập luận nghiêm túc."

"Và, cuối cùng , có điều này: Phương thức chạy của bạn có thể gọi mã của người khác—mã mà bạn không có quyền truy cập (mã nguồn và/hoặc quyền thay đổi mã). Phương thức này có thể không có kiểm tra isInterrupted và có thể sử dụng " try ... catch (Exception e) " để bắt tất cả các ngoại lệ."

Không ai có thể đảm bảo rằng một chủ đề sẽ bị dừng lại. Chỉ có một chủ đề có thể dừng chính nó.