"สวัสดี Amigo! คุณต้องยอมรับว่าความคิดยกเลิกของ Ellie นั้นยอดเยี่ยมมาก"
"ใช่."
"อันที่จริง มีสิ่งที่คล้ายกันอยู่ใน คลาส เธรดเฉพาะตัวแปรเท่านั้นที่ไม่ได้เรียกว่าisCancelมันเรียกว่าisInterruptและวิธีการที่ใช้ในการหยุดเธรดไม่ได้cancel()มันคืออินเตอร์รัปต์() "
"จริงหรือ?"
"ใช่ ลองดูสิ:"
รหัส | คำอธิบาย |
---|---|
|
เนื่องจากหลายเธรดสามารถเรียกใช้เมธอด run บนออบเจกต์ Clock เดียวกันเราจึงได้รับอ็อบเจกต์เธรดสำหรับเธรดปัจจุบัน
คลาส Clock เขียนคำว่า "Tick" ลงในคอนโซลวินาทีละครั้ง ตราบเท่าที่ ตัวแปร isInterrupt ของเธรดปัจจุบัน เป็นเท็จ เมื่อisInterruptกลายเป็นtrue วิธี การรัน จะสิ้นสุดลง |
|
เธรดหลักเริ่มต้นเธรดย่อย (นาฬิกา) ที่ควรทำงานตลอดไป
รอ 10 วินาทีและ ยกเลิกงานโดยเรียกวิธีการขัดจังหวะ เธรดหลักเสร็จสิ้นการทำงาน เธรดนาฬิกาสิ้นสุดการทำงาน |
นอกจากนี้ วิธี สลีปที่ผู้คนชอบใช้ในลูปไม่รู้จบใน วิธี รันจะตรวจสอบตัวแปรisInterrupt โดยอัตโนมัติ หากเธรดเรียกใช้ เมธอด sleepเมธอดจะตรวจสอบก่อนว่าisInterruptเป็นจริงสำหรับเธรดนั้น หรือไม่ ถ้าจริงเมธไม่นอน แต่จะโยนข้อยกเว้นInterruptedException แทน
"ทำไมต้องโยนข้อยกเว้น จะดีกว่าไหมถ้าใส่ isInterrupted() แทน isCancel() ในลูป"
" อย่างแรกเมธอดrunไม่มีการวนซ้ำเสมอ เมธอดอาจประกอบด้วยการเรียกใช้เมธอดอื่นๆ สองสามโหล จากนั้นคุณจะต้องเพิ่มการตรวจสอบ isInterrupted ก่อนเรียกเมธอดแต่ละครั้ง"
" ประการที่สองวิธีการบางอย่างที่เกี่ยวข้องกับการดำเนินการต่างๆ มากมาย อาจใช้เวลานานมากในการดำเนินการ"
" ประการที่สามการโยนข้อยกเว้นไม่ได้แทนที่การตรวจสอบ isInterrupted เป็นเพียงการเพิ่มเติมที่สะดวก ข้อยกเว้นที่ส่งกลับทำให้คุณสามารถคลาย call stack กลับไปยังวิธีการเรียกใช้ได้ อย่างรวดเร็ว "
" ประการที่สี่วิธีสลีปถูกใช้บ่อยมาก ปรากฎว่า วิธีการที่เป็นประโยชน์นี้ได้รับการปรับปรุงโดยการตรวจสอบโดยปริยายซึ่งมีประโยชน์ไม่น้อย ราวกับว่าไม่มีใครเพิ่มการตรวจสอบโดยเฉพาะ แต่มีอยู่ สิ่งนี้มีค่ามากเมื่อ คุณกำลังใช้รหัสของคนอื่น และคุณไม่สามารถเพิ่มเช็คได้ด้วยตัวเอง"
" ประการที่ห้าการตรวจสอบเพิ่มเติมไม่ได้ทำให้ประสิทธิภาพลดลง การเรียกใช้เมธอด sleep หมายความว่าเธรดไม่ควรทำอะไรเลย (ยกเว้นโหมดสลีป) ดังนั้นงานพิเศษจะไม่รบกวนใคร"
"นั่นเป็นข้อโต้แย้งที่ร้ายแรง"
"และสุดท้ายมีสิ่งนี้: วิธีการรันของคุณสามารถเรียกรหัสของคนอื่นได้—รหัสที่คุณไม่มีสิทธิ์เข้าถึง (ซอร์สโค้ดและ/หรือสิทธิ์ในการเปลี่ยนแปลงรหัส) อาจไม่มีการตรวจสอบ isInterrupted และอาจใช้ " ลอง ... จับ (ข้อยกเว้น e) " เพื่อจับข้อยกเว้นทั้งหมด"
ไม่มีใครรับประกันได้ว่าเธรดจะหยุดทำงาน ด้ายเท่านั้นที่จะหยุดตัวเองได้
GO TO FULL VERSION