"สวัสดี Amigo! นี่เป็นคำถามที่น่าสนใจที่คุณเคยสงสัยแล้วหรือกำลังจะทำเร็วๆ นี้คุณจะหยุดเธรดที่กำลังทำงานอยู่ได้อย่างไร "

สมมติว่าผู้ใช้บอกให้โปรแกรม «ดาวน์โหลดไฟล์จากอินเทอร์เน็ต» เธรดหลักสร้างเธรดย่อยแยกต่างหากสำหรับงานนี้ และส่งต่อไปยังออบเจกต์ที่มีเมธอดการรันประกอบด้วยการดำเนินการที่จำเป็นทั้งหมดเพื่อดาวน์โหลดไฟล์

แต่ทันใดนั้นผู้ใช้ก็เปลี่ยนใจ เขาไม่ต้องการดาวน์โหลดไฟล์ เราจะยกเลิกงานและหยุดเธรดได้อย่างไร

“ใช่ บอกฉันทีว่ายังไง”

" เราทำไม่ได้นั่นคือคำตอบที่พบบ่อยที่สุดและถูกต้องที่สุดคุณไม่สามารถหยุดเธรดได้ มีเพียงเธรดเท่านั้นที่สามารถหยุดตัวเองได้ "

แต่คุณสามารถส่งสัญญาณไปยังเธรดได้ โดยบอกให้เธรดทราบว่างานนั้นไม่จำเป็นต้องดำเนินการอีกต่อไปและควรยุติการทำงาน เช่นเดียวกับที่เธรดหลักสิ้นสุดโดยส่งคืนจากเมธอดหลัก เธรดลูกจะสิ้นสุดโดยส่งคืนจากเมธอดรัน

"วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร"

"คุณสามารถเพิ่มตัวแปรบางอย่าง เช่นบูลีนหากเป็นจริงเธรดจะทำงาน หากเป็นเท็จ  เธรดควรยุติ ตัวอย่างเช่น:"

รหัส คำอธิบาย
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

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

คลาสนาฬิกาเขียน «Tick» ไปยังคอนโซลวินาทีละครั้งตลอดไป

ถ้า ClockManager.isClockRun เป็นเท็จ วิธีการรันจะสิ้นสุดลง

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;
}

}
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป

รอ 10 วินาที และ ให้สัญญาณนาฬิกาสิ้นสุด

เธรดหลักเสร็จสิ้นการทำงาน

เธรดนาฬิกาสิ้นสุดการทำงาน

"แล้วถ้าเรามีหลายเธรดล่ะ?"

"เป็นการดีที่สุดที่จะมีตัวแปรดังกล่าวสำหรับแต่ละเธรด สะดวกที่สุดในการเพิ่มโดยตรงไปยังคลาส คุณสามารถเพิ่มตัวแปรบู ลีน isRunที่นั่น อย่างไรก็ตาม จะเป็นการดีกว่าถ้าเพิ่มตัวแปรบูลีนisCancelที่จะกลายเป็นจริงหากงานนั้น ยกเลิก."

รหัส คำอธิบาย
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");
}
}
}
คลาส Clock เขียนคำว่า «Tick» ลงในคอนโซลวินาทีละครั้ง ตราบเท่าที่isCancelเป็นเท็จ

เมื่อisCancelกลายเป็นจริง วิธีการรันจะสิ้นสุดลง

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

Thread.sleep(10000);
clock.cancel();
}
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป

รอ 10 วินาทีแล้ว ยกเลิกงานโดยเรียกวิธีการยกเลิก

เธรดหลักเสร็จสิ้นการทำงาน

เธรดนาฬิกาสิ้นสุดการทำงาน

"ฉันจะจำสิ่งนี้ไว้ ขอบคุณ เอลลี่"