กลไกการขัดจังหวะเธรดเป็นวิธีที่ดีที่สุดในการรับเธรด (ร่วมมือ) เพื่อตอบสนองคำขอให้หยุดสิ่งที่กำลังทำอยู่ เธรดใด ๆ (รวมถึงเธรดเองที่ฉันคิดว่า) สามารถเรียกinterrupt()
เธรดได้
ในทางปฏิบัติกรณีการใช้งานปกติสำหรับinterrupt()
กรอบงานบางประเภทหรือผู้จัดการบอกให้ผู้ปฏิบัติงานบางคนหยุดสิ่งที่พวกเขากำลังทำอยู่ หากเธรดของผู้ปฏิบัติงาน "ทราบการขัดจังหวะ" จะสังเกตได้ว่ามีการขัดจังหวะผ่านข้อยกเว้นหรือโดยการตรวจสอบแฟล็กถูกขัดจังหวะเป็นระยะ เมื่อสังเกตเห็นว่ามีการขัดจังหวะเธรดที่มีพฤติกรรมดีจะละทิ้งสิ่งที่กำลังทำอยู่และสิ้นสุดลง
สมมติว่าใช้กรณีข้างต้นโค้ดของคุณน่าจะถูกขัดจังหวะหากรันภายในกรอบงาน Java หรือจากเธรดผู้ปฏิบัติงานบางส่วน และเมื่อถูกขัดจังหวะโค้ดของคุณควรละทิ้งสิ่งที่กำลังทำอยู่และทำให้ตัวมันเองจบลงด้วยวิธีการที่เหมาะสมที่สุด ขึ้นอยู่กับวิธีการเรียกรหัสของคุณสิ่งนี้อาจทำได้โดยการส่งคืนหรือโดยทิ้งข้อยกเว้นที่เหมาะสม แต่มันคงไม่ควรโทรSystem.exit()
. (แอปพลิเคชันของคุณไม่จำเป็นต้องทราบว่าเหตุใดจึงถูกขัดจังหวะและแน่นอนว่าไม่ทราบว่ามีเธรดอื่นที่ต้องถูกขัดจังหวะโดยเฟรมเวิร์กหรือไม่)
ในทางกลับกันหากโค้ดของคุณไม่ได้รับการออกแบบให้ทำงานภายใต้การควบคุมของกรอบงานบางอย่างคุณอาจโต้แย้งว่าInterruptedException
เป็นข้อยกเว้นที่ไม่คาดคิด คือบั๊ก ในกรณีนี้คุณควรปฏิบัติตามข้อยกเว้นเช่นเดียวกับข้อบกพร่องอื่น ๆ เช่นห่อไว้ในข้อยกเว้นที่ไม่ได้ตรวจสอบและจับและบันทึกในจุดเดียวกันกับที่คุณจัดการกับข้อยกเว้นอื่น ๆ ที่ไม่ได้ตรวจสอบที่ไม่คาดคิด (หรืออีกวิธีหนึ่งคือแอปพลิเคชันของคุณสามารถเพิกเฉยต่อการขัดจังหวะและดำเนินการต่อในสิ่งที่กำลังทำอยู่)
1) ถ้าฉันไม่เคยขัดจังหวะเธรดอื่น ๆ ด้วยตัวเองอะไรจะทำให้เกิด InterruptedException ได้
ตัวอย่างหนึ่งคือถ้าRunnable
อ็อบเจ็กต์ของคุณถูกเรียกใช้งานโดยใช้ExecutorService
และshutdownNow()
ถูกเรียกใช้บริการ และตามทฤษฎีแล้วเธรดพูลของบุคคลที่สามหรือเฟรมเวิร์กการจัดการเธรดสามารถทำสิ่งนี้ได้อย่างถูกต้อง
2) ถ้าฉันไม่เคยขัดจังหวะเธรดอื่น ๆ ด้วยตัวเองโดยใช้ interrupt () ... InterruptedException
แล้วหมายความว่าอย่างไร? ฉันควรทำอย่างไรเมื่อจับได้ ปิดแอพของฉันไหม
คุณต้องวิเคราะห์ codebase เพื่อดูว่าinterrupt()
โทรออกอะไรและทำไม เมื่อคุณคิดได้แล้วคุณสามารถหาสิ่งที่ >> ส่วน << ของแอปต้องทำ
จนกว่าคุณจะรู้ว่าเหตุใดจึงInterruptedException
ถูกโยนฉันขอแนะนำให้ถือว่าเป็นข้อผิดพลาดอย่างหนัก เช่นพิมพ์ stacktrace ไปยังไฟล์บันทึกและปิดแอป (เห็นได้ชัดว่านั่นไม่ใช่คำตอบที่ถูกต้องเสมอไป ... แต่ประเด็นก็คือนี่คือ "บั๊ก" และจำเป็นต้องแจ้งให้ผู้พัฒนา / ผู้ดูแลระบบทราบ)
3) ฉันจะรู้ได้อย่างไรว่าใครโทรมาinterrupt()
?
ไม่มีคำตอบที่ดีสำหรับเรื่องนี้ สิ่งที่ดีที่สุดที่ฉันสามารถแนะนำได้คือตั้งค่าเบรกพอยต์Thread.interrupt()
และดูที่กลุ่มการโทร