วิธีการขัดจังหวะ
การขัดจังหวะหมายถึงการขัดจังหวะอย่างแท้จริง แต่ใน Java วิธีการ Thread.interrupt() จริง ๆ แล้วแจ้งเตือนเธรดในทางใดทางหนึ่งและไม่ได้ยุติเธรดโดยตรง ขึ้นอยู่กับบุคคลที่เขียนโค้ดเพื่อตัดสินใจว่าจะทำอย่างไร และโดยปกติแล้วเราจะยกเลิกเธรด
หากเธรดเรียกเมธอด wait(), wait(long) หรือ wait(long, int) ของคลาส Object หรือการ join(), join(long), join(long, int), sleep(long) หรือ sleep ของคลาส (long, int) ถูกบล็อกระหว่างวิธีการ สถานะการขัดจังหวะจะถูกล้าง และจะได้รับ InterruptedException ด้วย
หากเธรดบล็อกในการดำเนินการ I/O บนแชนเนลที่ขัดจังหวะ (java.nio.channels.InterruptibleChannel) แชนเนลจะถูกปิด สถานะการขัดจังหวะของเธรดจะถูกตั้งค่า และเธรดจะได้รับ ClosedByInterruptException
หากเธรดถูกบล็อกใน Selector (java.nio.channels.Selector) สถานะการขัดจังหวะของเธรดจะถูกตั้งค่า และจะกลับมาทันทีจากการดำเนินการเลือก ซึ่งอาจมีค่าที่ไม่ใช่ศูนย์ ราวกับว่าการเลือกถูกเรียกว่า การปลุก วิธีการของอุปกรณ์จะเหมือนกัน
หากไม่มีการบันทึกเงื่อนไขก่อนหน้านี้ สถานะการขัดจังหวะของเธรดจะถูกตั้งค่า
การขัดจังหวะเธรดที่ไม่ได้ใช้งานจะไม่มีผลใดๆ
ตรวจจับการขัดจังหวะ
วิธีการตรวจพบการขัดจังหวะนั้นขึ้นอยู่กับว่าเธรดกำลังทำอะไรอยู่
หากเธรดเรียกเมธอดที่สามารถส่ง InterruptException ให้จับ InterruptException จากนั้นจัดการใน catch block (โดยปกติจะออกจากเมธอด run เพื่อขัดจังหวะเธรด)
หากคุณเรียกใช้วิธีอื่น คุณสามารถตรวจสอบ Thread.interrupted เมื่อไม่ได้ใช้งาน เพื่อตรวจสอบว่าได้รับสัญญาณขัดจังหวะหรือไม่ และดำเนินการหลังจากยืนยันว่าได้รับสัญญาณขัดจังหวะแล้ว InterruptException สามารถถูกส่งออกเพื่อให้สอดคล้องกับวิธีการจัดการก่อนหน้านี้
สถานะขัดจังหวะ
กลไกการขัดจังหวะของเธรดถูกนำมาใช้โดยใช้การตั้งค่าสถานะภายในของสถานะการขัดจังหวะ สถานะการขัดจังหวะจะถูกตั้งค่าเมื่อมีการเรียกใช้วิธีการขัดจังหวะ () ของเธรด (ดูคำอธิบายวิธีการขัดจังหวะด้านบน)
มีสองวิธีในการขอรับสถานะการขัดจังหวะของเธรด:
เรียกเมธอดคงที่ Thread.interrupted() นอกเหนือจากการส่งคืนสถานะการขัดจังหวะของเธรดปัจจุบันแล้ว วิธีนี้ยังล้างสถานะการขัดจังหวะของเธรดปัจจุบันอีกด้วย กล่าวอีกนัยหนึ่ง หากเรียกเมธอดนี้สองครั้งติดต่อกัน การเรียกครั้งที่สองจะส่งกลับค่าเท็จ (หลังจากการเรียกครั้งแรกได้ล้างสถานะการขัดจังหวะแล้ว และก่อนที่การเรียกครั้งที่สองจะตรวจสอบสถานะการขัดจังหวะ เธรดปัจจุบันจะถูกขัดจังหวะอีกครั้ง ข้อยกเว้น ).
เรียกเมธอด isInterrupted() ของเธรดที่ระบุ เมธอดนี้จะส่งคืนสถานะขัดจังหวะของเธรดที่ระบุเท่านั้น โดยไม่ส่งผลกระทบต่อสถานะขัดจังหวะของเธรด
มีสองวิธีในการล้างสถานะการขัดจังหวะของเธรด:
ดังที่กล่าวข้างต้น การเรียก Thread.interrupted()
เมื่อเรียกใช้เมธอด Interrupted() ของเธรดเพื่อทำให้เกิด InterruptedException สถานะการขัดจังหวะของเธรดจะถูกล้างไปพร้อมๆ กัน รวมถึงเมธอด wait(), wait(long) หรือ wait(long, int) ของ Object คลาสหรือเธรดของ join() , join(long) , join(long, int) , sleep(long) หรือ sleep(long, int) วิธีการ