"สวัสดี Amigo! นี่เป็นคำถามที่น่าสนใจที่คุณเคยสงสัยแล้วหรือกำลังจะทำเร็วๆ นี้คุณจะหยุดเธรดที่กำลังทำงานอยู่ได้อย่างไร "
สมมติว่าผู้ใช้บอกให้โปรแกรม «ดาวน์โหลดไฟล์จากอินเทอร์เน็ต» เธรดหลักสร้างเธรดย่อยแยกต่างหากสำหรับงานนี้ และส่งต่อไปยังออบเจกต์ที่มีเมธอดการรันประกอบด้วยการดำเนินการที่จำเป็นทั้งหมดเพื่อดาวน์โหลดไฟล์
แต่ทันใดนั้นผู้ใช้ก็เปลี่ยนใจ เขาไม่ต้องการดาวน์โหลดไฟล์ เราจะยกเลิกงานและหยุดเธรดได้อย่างไร
“ใช่ บอกฉันทีว่ายังไง”
" เราทำไม่ได้นั่นคือคำตอบที่พบบ่อยที่สุดและถูกต้องที่สุดคุณไม่สามารถหยุดเธรดได้ มีเพียงเธรดเท่านั้นที่สามารถหยุดตัวเองได้ "
แต่คุณสามารถส่งสัญญาณไปยังเธรดได้ โดยบอกให้เธรดทราบว่างานนั้นไม่จำเป็นต้องดำเนินการอีกต่อไปและควรยุติการทำงาน เช่นเดียวกับที่เธรดหลักสิ้นสุดโดยส่งคืนจากเมธอดหลัก เธรดลูกจะสิ้นสุดโดยส่งคืนจากเมธอดรัน
"วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร"
"คุณสามารถเพิ่มตัวแปรบางอย่าง เช่นบูลีนหากเป็นจริงเธรดจะทำงาน หากเป็นเท็จ เธรดควรยุติ ตัวอย่างเช่น:"
รหัส | คำอธิบาย |
---|---|
|
คลาสนาฬิกาเขียน «Tick» ไปยังคอนโซลวินาทีละครั้งตลอดไป ถ้า ClockManager.isClockRun เป็นเท็จ วิธีการรันจะสิ้นสุดลง |
|
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป
รอ 10 วินาที และ ให้สัญญาณนาฬิกาสิ้นสุด เธรดหลักเสร็จสิ้นการทำงาน เธรดนาฬิกาสิ้นสุดการทำงาน |
"แล้วถ้าเรามีหลายเธรดล่ะ?"
"เป็นการดีที่สุดที่จะมีตัวแปรดังกล่าวสำหรับแต่ละเธรด สะดวกที่สุดในการเพิ่มโดยตรงไปยังคลาส คุณสามารถเพิ่มตัวแปรบู ลีน isRunที่นั่น อย่างไรก็ตาม จะเป็นการดีกว่าถ้าเพิ่มตัวแปรบูลีนisCancelที่จะกลายเป็นจริงหากงานนั้น ยกเลิก."
รหัส | คำอธิบาย |
---|---|
|
คลาส Clock เขียนคำว่า «Tick» ลงในคอนโซลวินาทีละครั้ง ตราบเท่าที่isCancelเป็นเท็จ
เมื่อisCancelกลายเป็นจริง วิธีการรันจะสิ้นสุดลง |
|
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป
รอ 10 วินาทีแล้ว ยกเลิกงานโดยเรียกวิธีการยกเลิก เธรดหลักเสร็จสิ้นการทำงาน เธรดนาฬิกาสิ้นสุดการทำงาน |
"ฉันจะจำสิ่งนี้ไว้ ขอบคุณ เอลลี่"
GO TO FULL VERSION