"Xin chào, Amigo! Đây là một câu hỏi thú vị mà bạn đã có hoặc bạn sẽ sớm hỏi. Làm cách nào để bạn dừng chuỗi đang chạy? "

Giả sử người dùng yêu cầu chương trình «tải xuống một tệp từ Internet». Luồng chính tạo một luồng con riêng biệt cho công việc này và truyền cho nó một đối tượng có phương thức chạy chứa tất cả các hành động cần thiết để tải xuống tệp.

Nhưng đột nhiên người dùng thay đổi ý định. Anh ấy không muốn tải tập tin. Làm thế nào để chúng tôi hủy bỏ một công việc và dừng chuỗi?

"Vâng, nói cho tôi biết làm thế nào?"

" Chúng tôi không thể. Đó là câu trả lời phổ biến nhất và đúng nhất. Bạn không thể dừng một chuỗi. Chỉ có nó mới có thể tự dừng. "

Nhưng bạn có thể gửi một tín hiệu đến một luồng, theo một cách nào đó, nói với nó rằng công việc không cần phải được thực hiện nữa và nó sẽ kết thúc. Giống như luồng chính kết thúc bằng cách quay lại từ phương thức chính, luồng con kết thúc bằng cách quay lại từ phương thức chạy.

"Cách tốt nhất để làm điều đó là gì?"

"Bạn có thể thêm một số biến, chẳng hạn như một boolean . Nếu nó là true , luồng sẽ chạy. Nếu nó là false  , luồng sẽ kết thúc. Ví dụ như thế này:"

Mã số Sự miêu tả
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Lớp Đồng hồ ghi «Tick» vào bảng điều khiển mỗi giây một lần mãi mãi

Nếu ClockManager.isClockRun là sai, thì phương thức chạy sẽ kết thúc.

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

Thread.sleep(10000);
isClockRun = false;
}

}
Chủ đề chính bắt đầu một chủ đề con (đồng hồ) sẽ chạy mãi mãi

Đợi 10 giây và cho đồng hồ báo hiệu kết thúc.

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ó.

"Nếu chúng ta có nhiều chủ đề thì sao?"

"Tốt nhất là có một biến như vậy cho mỗi luồng. Cách thuận tiện nhất là thêm nó trực tiếp vào lớp. Bạn có thể thêm một biến isRun boolean ở đó. Tuy nhiên, tốt hơn là thêm một biến isCancel boolean sẽ trở thành true nếu tác vụ là hủy bỏ."

Mã số Sự miêu tả
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
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à isCancel là sai.

Khi isCancel 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);
clock.cancel();
}
Chủ đề chính bắt đầu một chủ đề 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 hủy.

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ó.

"Tôi sẽ ghi nhớ điều này. Cảm ơn, Ellie."