คำอธิบายโดยละเอียดและตัวอย่างของ Java Thread Sleep () และรอ ()
นอน
1.SLEEP เป็นวิธีการแบบคงที่ของเธรด สิ่งนี้ช่วยให้เธรดที่ใช้งานโดย Runnable เพื่อใช้วิธีการนอนหลับ นอกจากนี้ยังหลีกเลี่ยงวิธีการโทร Sleep () ซึ่งกันและกันก่อนที่เธรดจะทำให้เกิดการหยุดชะงัก
2. การนอนหลับ () ต้องได้รับเวลานอนเมื่อดำเนินการ ในระหว่างการนอนหลับ (ระหว่างการปิดกั้นด้าย) CPU จะละทิ้งหัวข้อนี้และทำงานอื่น ๆ เมื่อเวลาการนอนหลับอยู่เธรดจะตื่นขึ้นมาโดยอัตโนมัติ แต่เธรดจะไม่ถูกดำเนินการทันที แต่จะรอให้ CPU จัดสรรทรัพยากรเพื่อแข่งขันกับเธรดอื่น ๆ
3. นอกจากนี้หากเธรดนี้ได้รับการล็อคมาก่อนล็อคจะไม่ถูกปล่อยออกมาในระหว่างการนอนหลับ โปรแกรมอื่น ๆ ที่รอการล็อคเครื่องนี้จะต้องรอให้เธรดนี้ตื่นขึ้นมาและทำงานหลังจากดำเนินการ
รหัสที่เกี่ยวข้องกับการนอนหลับ
Public Class ThreadTest2 {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {system.out.println ("เริ่มต้นการทดสอบของเรา"); threadsleep sleep = new threadsleep (); ลอง {Thread Thread1 = ใหม่เธรด (sleep, "Passer a"); Thread Thread2 = Thread ใหม่ (sleep, "Passer B"); Thread1.start (); Thread2.start (); } catch (exception e) {e.printstacktrace (); } system.out.println ("การทดสอบจบ"); }} คลาส ThreadSleep ใช้งาน Runnable {int count = 0; @Override โมฆะสาธารณะ Run () {System.out.println (thread.currentthread (). getName () + "พูด: สวัสดีสลีป !!"); นับ(); } โมฆะสาธารณะนับ () {ในขณะที่ (นับ <20) {system.out.println (thread.currentthread (). getName () + "พูดว่า: นับคือ" + นับ); ลอง {count ++; Thread.sleep (100); } catch (exception e) {e.printstacktrace (); -บันทึกเอาต์พุต
เริ่มต้นการทดสอบของเราจบลงด้วยการพูดคุย: สวัสดีการนอนหลับ !! Passerby A พูดว่า: นับคือ 0 Passerby B พูดว่า: สวัสดีนอนหลับ !! Passerby B กล่าวว่า: นับเป็น 1 คนที่พูดว่า: นับคือ 2 คนเดินผ่าน B พูดว่า: นับคือ 2 คนเดินผ่านบี้ a พูดว่า: นับคือ 4 คนเดินผ่าน B พูดว่า: นับเป็น 4 คนเดินผ่าน A Passerby A กล่าวว่า: นับ 6 คนที่ผ่านมา Passerby B พูดว่า: นับคือ 14 คนที่พูดถึง: นับคือ 14 คนเดินผ่านบี้ a พูดว่า: นับคือ 16 คนเดินผ่าน b พูดว่า: นับคือ 16 คนที่พูดคุยกันว่า: นับคือ 18 Passerby B พูดว่า: นับ 18 คือ 18
ผ่านการบันทึกเราสามารถพบว่าเธรด A และ Thread B นั้นถูกดำเนินการโดยทั่วไปสลับกัน แต่มันผิดปกติและมีปัญหาพร้อมกัน
สถานการณ์นี้เป็นเพราะรหัสกำหนดเวลานอนเป็น 100 มิลลิวินาที เนื่องจากความเร็วในการดำเนินการเพิ่มขึ้นของการดำเนินการนั้นเร็วมากเธรดเกือบจะนอนหลับในเวลาเดียวกันและจากนั้นตื่นขึ้นมาในเวลาเดียวกันและทำให้เกิดการเกิดขึ้นพร้อมกัน
ถัดไปคุณจะต้องเพิ่มบล็อกซิงโครไนซ์เพื่อตรวจสอบว่าการล็อคเวลานอนหลับถูกปล่อยออกมาหรือไม่
Public Class ThreadTest2 {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {system.out.println ("เริ่มต้นการทดสอบของเรา"); threadsleep sleep = new threadsleep (); ลอง {Thread Thread1 = ใหม่เธรด (sleep, "Passer a"); Thread Thread2 = Thread ใหม่ (sleep, "Passer B"); Thread1.start (); Thread2.start (); } catch (exception e) {e.printstacktrace (); } system.out.println ("การทดสอบจบ"); }} คลาส ThreadSleep ใช้งาน Runnable {int count = 0; @Override โมฆะสาธารณะ Run () {System.out.println (thread.currentthread (). getName () + "พูด: สวัสดีสลีป !!"); นับ(); } การนับโมฆะสาธารณะ () {ในขณะที่ (นับ <20) {ซิงโครไนซ์ (นี่) {system.out.println (thread.currentthread (). getName () + "พูดว่า: นับคือ" + นับ); ลอง {count ++; Thread.sleep (100); } catch (exception e) {e.printstacktrace (); -บันทึกเอาต์พุต
เริ่มต้นการทดสอบของเรา Passerby a พูดว่า: สวัสดีนอนหลับ !! Passerby A พูดว่า: นับเป็น 0 การทดสอบอยู่เหนือ Passerby B พูดว่า: สวัสดีการนอนหลับ !! Passerby A พูดว่า: นับเป็น 1 คนที่พูดว่า: นับคือ 2 คนเดินผ่านบี้ a พูดว่า: นับเป็น 3 คนเดินผ่านบี้ a พูดว่า: นับเป็น 4 คนที่พูดว่า: นับเป็น 5 คนเดินผ่านบี้ a พูดว่า: นับ 6 คนที่ผ่านมา 13-passer A พูดว่า: นับคือ 14-passer a พูดว่า: นับคือ 15-passer a พูดว่า: นับคือ 16-passer a พูดว่า: นับคือ 17-passer a พูดว่า: นับคือ 18-passer a พูดว่า: นับคือ 19-passer B พูดว่า: นับ 20 คือ 20
จะเห็นได้จากบันทึกที่โดยทั่วไปเธรด A กำลังดำเนินการ นี่เป็นเพราะในระหว่างการนอนหลับการล็อคของเครื่องมักจะอยู่ในเธรด A ดังนั้นเธรด B สามารถรอได้จนกว่าเธรดจะปล่อยล็อค
รอ
1. WAIT () เป็นวิธีการของคลาสวัตถุ เมื่อมีการเรียกวิธีการรอ () เธรดจะเข้าสู่พูลรอที่เกี่ยวข้องกับวัตถุและปล่อยล็อคที่มี
2. หลังจากดำเนินการรอ () คุณต้องใช้วิธีการแจ้งเตือน () หรือวิธีการแจ้งเตือน () หรือตั้งค่าเวลารอ (รอ (นาน)) เพื่อปลุกเธรดในพูลเธรดรอ
3. การรอ () จะต้องอยู่ในบล็อกที่ซิงโครไนซ์มิฉะนั้นจะมีการรายงาน "java.lang.illegalmonitorstateException" จะมีการรายงานเมื่อเวลาผ่านไป
รหัสที่เกี่ยวข้องกับการรอ
Public Class ThreadTest2 {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {system.out.println ("เริ่มต้นการทดสอบของเรา"); threadsleep sleep = new threadsleep (); ลอง {Thread Thread1 = ใหม่เธรด (sleep, "passman a"); Thread Thread2 = Thread ใหม่ (Sleep, "Passman B"); Thread1.start (); Thread2.start (); } catch (exception e) {e.printstacktrace (); } system.out.println ("การทดสอบจบ"); }} คลาส ThreadSleep ใช้งาน Runnable {int count = 0; @Override โมฆะสาธารณะ Run () {System.out.println (thread.currentthread (). getName () + "พูด: สวัสดีสลีป !!"); นับ(); } การนับโมฆะสาธารณะ () {ในขณะที่ (นับ <20) {ซิงโครไนซ์ (นี่) {system.out.println (thread.currentthread (). getName () + "พูดว่า: นับคือ" + นับ); ลอง {count ++; this.wait (100); } catch (exception e) {e.printstacktrace (); -บันทึกเอาต์พุต
เริ่มต้นการทดสอบของเรา Passerby a พูดว่า: สวัสดีนอนหลับ !! Passerby A พูดว่า: นับเป็น 0 การทดสอบอยู่เหนือ Passerby B พูดว่า: สวัสดีการนอนหลับ !! Passerby B กล่าวว่า: นับเป็น 1 คนที่พูดว่า: นับคือ 2 Passerby B พูดว่า: นับคือ 3 Passerby a พูดว่า: นับคือ 4 Passerby B พูดว่า: นับคือ 5 Passerby A พูดว่า: นับ 6 คนเดินผ่าน B กล่าวว่า Passerby B พูดว่า: นับคือ 14 คนที่พูดว่า: นับคือ 15 คนเดินผ่าน b พูดว่า: นับคือ 16 คนเดินผ่านไปตามคำพูด: นับคือ 17 คนเดินผ่าน B พูดว่า: นับคือ 18 คนเดินผ่าน
ผ่านบันทึกจะพบได้ว่าในกรณีของการรอการล็อคจะถูกปล่อยออกมา
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!