บางครั้งด้ายแขวนมีประโยชน์ ตัวอย่างเช่นเธรดแยกต่างหากสามารถใช้เพื่อแสดงเวลาของวัน หากผู้ใช้ไม่ต้องการใช้นาฬิกาเธรดจะถูกระงับ ไม่ว่าในกรณีใดการระงับเธรดนั้นง่ายมากและเมื่อถูกระงับการรีสตาร์ทเธรดก็เป็นเรื่องง่าย
กลไกสำหรับการระงับการยกเลิกและการกู้คืนเธรดแตกต่างกันใน Java 2 และรุ่นก่อนหน้า แม้ว่าคุณจะใช้ Java 2 เพื่อเขียนโค้ด แต่คุณก็ยังต้องเข้าใจว่าการดำเนินการเหล่านี้ดำเนินการอย่างไรในสภาพแวดล้อม Java ยุคแรก ตัวอย่างเช่นคุณอาจต้องอัปเดตหรือบำรุงรักษารหัสเก่า คุณต้องเข้าใจว่าทำไม Java 2 จึงมีการเปลี่ยนแปลงดังกล่าว ด้วยเหตุผลเหล่านี้ต่อไปนี้อธิบายวิธีดั้งเดิมของการดำเนินการควบคุมเธรดตามด้วยวิธี Java 2
หยุดชั่วคราวการกู้คืนและการสิ้นสุดของเธรดใน Java 1.1 หรือก่อนหน้านี้
ก่อนเวอร์ชัน Java2 โปรแกรมจะใช้ Suspend () และ Resume () เพื่อหยุดและรีสตาร์ทเธรด พวกเขาอยู่ในรูปของ:
โมฆะสุดท้าย Suspend () Void Resume สุดท้าย ()
ขั้นตอนต่อไปนี้อธิบายวิธีการเหล่านี้:
// การใช้งาน Suspend () และ Resume (). คลาส NewThread ใช้งาน {ชื่อสตริง; ออก. println ("เธรดใหม่:" + t); T.Start (); i> 0; i--) {system.out.println (ชื่อ + ":" + i); "::::::::::::::::::::: กระทาน ::::::::::::::::::::);} system.out.println (ชื่อ + "ออก"); Newthread ("One"); .SLEEP (1,000); การนอนหลับ (1,000); รอให้เสร็จสิ้นการลอง {system.out.println ("รอให้เธรดเสร็จสิ้น"); println ("Main Thread interrupted"); ส่วนหนึ่งของผลลัพธ์ของโปรแกรมมีดังนี้:
กระทู้ใหม่: เธรด [One, 5, Main] One: 15New Thread: Thread [Two, 5, Main] สอง: 15one: 14two: 14one: 13two: 13one: 12two: 11two: 11suspending Thread Onetwo: 10two: 9two: 8two: 8two: 8two: 8two: 8two: 8two: 8two: 8two: 8two 7two: 6resuming Thread Onsuspending Thread สองวัน: 10one: 9one: 8one: 7one: 6resuming Thread Twowaiting สำหรับเธรดที่จะเสร็จ ออกจากเธรด
คลาสเธรดยังกำหนด Stop () เพื่อยุติเธรด รูปแบบของมันมีดังนี้:
โมฆะหยุด ()
เมื่อเธรดถูกยกเลิกแล้วจะไม่สามารถดำเนินการต่อโดย Resume () เพื่อดำเนินการต่อได้
ระงับกู้คืนและยุติเธรดใน Java
วิธีการที่กำหนดไว้ด้วยเธรด (), resume () และ stop () ดูเหมือนจะเป็นวิธีที่สมบูรณ์แบบและสะดวกในการจัดการเธรดและไม่สามารถใช้ในโปรแกรม Java รุ่นใหม่ได้ นี่คือเหตุผล วิธีการระงับ () ของคลาสเธรดไม่ได้รับการสนับสนุนใน Java2 เนื่องจากบางครั้ง Suspend () อาจทำให้เกิดความล้มเหลวของระบบที่ร้ายแรง สมมติว่าเธรดสำหรับโครงสร้างข้อมูลที่สำคัญถูกล็อคหากเธรดถูกระงับไว้ที่นั่นเธรดที่ถูกล็อคจะไม่ยอมแพ้การควบคุมทรัพยากร หัวข้ออื่น ๆ ที่รอทรัพยากรเหล่านี้อาจถูกปิดกั้น
วิธีการเรซูเม่ () ยังไม่ได้รับการอนุมัติ มันไม่ได้ทำให้เกิดปัญหา แต่ไม่สามารถใช้งานได้อย่างอิสระหากไม่มีวิธีการระงับ () วิธีการหยุด () ของคลาสเธรดยังไม่เห็นด้วยใน Java 2 นี่เป็นเพราะวิธีนี้อาจทำให้ระบบล้มเหลวอย่างร้ายแรง ลองนึกภาพเธรดกำลังเขียนโครงสร้างข้อมูลที่แม่นยำและสำคัญและทำให้เสร็จสิ้นเพียงเพียงเศษเสี้ยวของมัน หากเธรดสิ้นสุดลงในขณะนี้โครงสร้างข้อมูลอาจยังคงอยู่ในสถานะความผิดพลาด
เนื่องจากใน Java 2, suspend (), resume () และวิธีการหยุด () ไม่สามารถใช้ในการควบคุมเธรดคุณอาจคิดว่าไม่มีวิธีหยุดกู้คืนและจบเธรด จริงๆแล้วมันไม่ใช่กรณี แต่จะต้องออกแบบเธรดเพื่อให้วิธีการ Run () ตรวจสอบเป็นระยะเพื่อตรวจสอบว่าควรระงับเธรดกลับมาทำงานต่อหรือยุติการดำเนินการของตัวเอง เป็นตัวแทนสิ่งนี้ทำได้โดยการสร้างตัวแปรธงที่ระบุสถานะของเธรด ตราบใดที่ธงถูกตั้งค่าเป็น "กำลังทำงาน" วิธีการเรียกใช้ () จะต้องดำเนินการต่อโดยเธรด หากธงคือ "ระงับ" เธรดจะต้องหยุดชั่วคราว หากตั้งค่าเป็น "หยุด" เธรดจะต้องถูกยกเลิก
แน่นอนว่ามีหลายวิธีในการเขียนโค้ดดังกล่าว แต่หัวข้อหลักควรเหมือนกันสำหรับโปรแกรมทั้งหมด
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการรอ () และแจ้ง () วิธีการที่สืบทอดมาจากการควบคุมวัตถุการดำเนินการของเธรด ตัวอย่างนี้คล้ายกับโปรแกรมที่กล่าวถึงก่อนหน้านี้ อย่างไรก็ตามไม่มีวิธีใดที่ไม่ได้รับการอนุมัติมีประโยชน์ ให้เราคิดเกี่ยวกับการดำเนินการของโปรแกรม
คลาส NewTread มีตัวแปรอินสแตนซ์ suspendFlag ที่ใช้ในการควบคุมการดำเนินการของเธรด มันเริ่มต้นเป็นเท็จโดยตัวสร้าง วิธีการเรียกใช้ () มีบล็อกที่ตรวจสอบการประกาศการซิงโครไนซ์ของ SuspendFlag หากตัวแปรเป็นจริงวิธีการรอ () จะถูกเรียกให้ระงับเธรด เมธอด mysuspend () ตั้งค่า suspendflag เป็นจริง เมธอด myresume () ตั้งค่า SuspendFlag เป็น FALSE และเรียกใช้วิธีการแจ้งเตือน () เพื่อกระตุ้นเธรด ในที่สุดวิธีการหลัก () ได้รับการแก้ไขเพื่อเรียกใช้วิธี mysuspend () และ myresume ()
// การระงับและการกู้คืนเธรดสำหรับ Java2class Newthread ใช้งาน {ชื่อสตริง; ออก. println ("เธรดใหม่:" + t); t i = 15; }}} catch (interruptedException e) {system.out.println (ชื่อ + "ถูกขัดจังหวะ"); โมฆะ myresume () {suspendflag = false; ลอง {thread.sleep (1,000); Thread One "); ob2.mysuspend (); system.out.println (" ระงับเธรดสอง "); thread.sleep (1,000); ob2.myresume (); system.out.println ( ; t.join (); ob2.t.join (); }ผลลัพธ์ของโปรแกรมนี้เหมือนกับโปรแกรมก่อนหน้า ต่อมาในหนังสือเล่มนี้คุณจะเห็นตัวอย่างเพิ่มเติมของการใช้กลไก Java 2 เพื่อควบคุมเธรด แม้ว่ากลไกนี้จะไม่ "สะอาด" เป็นวิธีเก่า แต่เป็นวิธีที่จะทำให้แน่ใจว่าไม่มีข้อผิดพลาดเกิดขึ้นในเวลารันไทม์ มันเป็นวิธีที่รหัสใหม่ทั้งหมดต้องใช้