1. จุดความรู้ขัดจังหวะ
สรุปต่อไปนี้ขึ้นอยู่กับ JDK8
บทความนี้จะไม่อธิบายการขัดจังหวะอย่างสมบูรณ์ แต่จะแสดงรายการที่สำคัญกว่าเท่านั้น สำหรับความเข้าใจที่สมบูรณ์เกี่ยวกับเธรด interrupt คุณสามารถดูวัสดุอ้างอิง
นี่คือบทความใหม่ที่ช่วยให้เข้าใจการอ้างอิง:
หลังจากเรียกใช้วิธีการขัดจังหวะธงขัดจังหวะจะถูกตั้งค่าเป็นจริงสำหรับเธรดในสถานะที่ถูกบล็อก ไม่ว่าจะตอบสนองต่อการขัดจังหวะ (ตระหนักถึงการเปลี่ยนแปลงในบิตธงนี้) ขึ้นอยู่กับการออกแบบของ API การปิดกั้น IO API ของ JDK บล็อกซิงโครไนซ์แบบซิงโครไนซ์และวิธีการมากมายในการล็อค (ไม่รวมล็อคอย่างต่อเนื่อง) ไม่ตอบสนองต่อการขัดจังหวะ แน่นอนว่าเธรดการโทรสามารถใช้การตัดสินบิตธงเพื่อให้ API ออกแบบโดยตัวเองตอบสนองต่อการขัดจังหวะ
หลังจากเรียกใช้วิธีการขัดจังหวะแล้ว InterruptedException ** จะถูกโยนลงบนเธรดในสถานะการรอ/timed_waiting และจะตั้งค่าการตั้งค่าสถานะ Flag Bit ** ตัวอย่างเช่นหลังจากเธรดโทร thead.sleep, object.wait ()
หากเธรดไม่ได้เริ่มต้น (ใหม่) หรือสิ้นสุดลง (สิ้นสุด) การเรียก interrupt () จะไม่มีผลกับมันและจะไม่ตั้งค่าสถานะอินเตอร์รัปต์
แนวทางปฏิบัติที่ดีที่สุด: บางครั้งวิธีการบางอย่างไม่ได้รับอนุญาตให้ถูกขัดจังหวะหรือยกเลิกในการออกแบบ แต่เมื่อเธรดอื่นส่งคำขอขัดจังหวะพวกเขายังต้องเก็บคะแนนเพื่ออำนวยความสะดวกให้ผู้โทรคนอื่น ๆ "เข้าใจสถานการณ์"
งานสาธารณะ getNextTask (blockingqueue <task> คิว) {บูลีนขัดจังหวะ = false; ลอง {ในขณะที่ (จริง) {ลอง {return queue.take (); } catch (interruptedException e) {// เครื่องหมายสถานะการพึ่งพาในการขัดจังหวะ fianlly = true; // ตกและลอง retry}}} ในที่สุด {ถ้า (ขัดจังหวะ) // หมายเหตุใน fianlly เพื่อให้แน่ใจว่าไม่มีเธรดการแจ้งเตือนขัดจังหวะที่ขาดหายไป -การดำเนินการยกเลิกบางอย่างสามารถนำไปใช้ได้โดยใช้การขัดจังหวะ ตัวอย่างเช่น:
แพคเกจพร้อมกัน; นำเข้า java.util.concurrent.blockingqueue; นำเข้า java.util.concurrent.callable; นำเข้า java.util.concurrent.executorservice; นำเข้า Java.util.concurrent.executors;/** * {โมฆะสาธารณะคงที่หลัก (สตริง [] args) พ่น InterruptedException {interrupttask interrupttask = new InterruptTask (); ExecutorService ExecutorService = Executors.newsingLetHreatHreadExecutor (); ExecutorService.submit (Interrupttask); Thread.sleep (100); interrupttask.cancel (); ExecutorService.Shutdown (); }}/*** งานที่ตอบสนองต่อการขัดจังหวะ*/คลาส InterruptTask ดำเนินการ callable <teger> {ส่วนตัว blockingqueue <task> คิว; // บันทึกเธรดที่จะถูกขัดจังหวะเธรด t; @Override การเรียกจำนวนเต็มสาธารณะ () พ่น InterruptedException {System.out.println ("เริ่มงานที่ถูกบล็อก"); ลอง {t = tread.currentthread (); thread.currentthread (). sleep (50000); } catch (interruptedException e) {system.out.println ("ถูกขัดจังหวะ"); E.PrintStackTrace (); } return 0; } โมฆะสาธารณะ cancel () {system.out.println ("Cacel เป็นงาน .... "); // calling thread.currentthread () ที่นี่จะได้รับเธรดหลักแทนที่จะเป็นเธรดในพูลเธรดถ้า (! t.isinterrupt ()) {t.interrupt (); -สรุป
ข้างต้นคือการอัปเดตใน Java ตามบทสรุป JDK8 ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!