แผนภูมิเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | นอน | รอ |
---|---|---|
ขั้นพื้นฐาน | วิธีสลีปไม่ปล่อยล็อควัตถุจนกว่าจะถูกขัดจังหวะ | วิธีการรอปล่อยล็อคบนวัตถุเพื่อให้วัตถุอื่นดำเนินการจนกว่าการแจ้งเตือนหรือแจ้งให้ทราบวิธีการทั้งหมดจะถูกเรียก |
ชั้น | วิธีการนอนหลับถูกกำหนดไว้ในระดับกระทู้ | มีการกำหนดเมธอด Wait ในคลาส Object |
Synchronized | ไม่จำเป็นต้องเรียกใช้เมธอด Sleep ภายในบริบทที่ซิงโครไนซ์ | ต้องรอวิธีเรียกใช้ภายในบริบทที่ซิงโครไนซ์ |
เสร็จสิ้น | การดำเนินการกับโหมดสลีปจะเสร็จสมบูรณ์เมื่อเธรดขัดจังหวะหรือเวลาของโหมดสลีปหมดอายุ | การรอการประมวลผลเมธอดเสร็จสมบูรณ์เมื่อการแจ้งเตือน () หรือการแจ้งเตือนทั้งหมด () ขัดจังหวะวิธีการนั้น |
คงที่ | วิธีสลีปเป็นวิธีสแตติก | วิธีการรอไม่คงที่นั่นคือสาเหตุที่มันต้องการวัตถุที่จะเรียกมัน |
การกระทำ | เมธอด sleep ถูกเรียกใช้งานบนเธรดปัจจุบัน | วิธีการรอดำเนินการบนวัตถุ |
ข้อยกเว้น | InterruptedException | IllegalArgumentException, IllegalMonitorStateException, InterruptedException |
ความหมายของวิธีการนอนหลับ
เมธอด sleep เป็นวิธีส แตติก ของคลาส Thread เมธอด sleep ถูกเรียกใช้เมื่อเธรดไม่ต้องการทำงานใด ๆ ตามระยะเวลาที่กำหนด เมธอด sleep เสร็จสิ้นการเรียกใช้งานเมื่อเวลาของเมธอดหมดอายุหรือถูกขัดจังหวะโดยเธรดอื่นในการเรียกใช้งาน หลังจากเมธอด sleep เสร็จสิ้นเธรดจะได้รับสถานะที่รันได้อีกครั้ง วิธีการนอนหลับมีสองวิธีดังแสดงด้านล่าง
ประชาชนโมฆะพื้นเมืองคงนอนหลับ (มิลลิวินาทียาว); โมฆะคงที่สาธารณะการนอนหลับ (มิลลิวินาทียาวและ int nanosecond);
ในสองรูปแบบข้างต้นคุณสามารถสังเกตเวลาที่กล่าวถึงทั้งในรูปแบบของวิธีการนอนหลับ นี่เป็นเพราะเธรดสลีปเสมอสำหรับเวลาเฉพาะที่กล่าวถึงในพารามิเตอร์ เมธอด sleep สามารถถูกขัดจังหวะโดยเธรดอื่น ๆ ในระหว่างการประมวลผล ด้วยเหตุนี้มันสามารถโยนการขัดจังหวะโดย Execption คุณต้องระมัดระวังว่าข้อยกเว้นนั้นได้รับการจัดการทั้งโดยลอง / จับบล็อกหรือโดยการโยนคำหลักมิฉะนั้นจะทำให้เกิดข้อผิดพลาดในเวลารวบรวม เมธอด sleep เก็บล็อกบนวัตถุปัจจุบันในการดำเนินการและไม่อนุญาตให้วัตถุอื่นดำเนินการจนกว่าจะเสร็จสิ้นการดำเนินการ
ความหมายของวิธีการรอ
รอเป็นวิธีการที่กำหนดไว้ในคลาส วัตถุ วิธีการรอจะใช้เมื่องานหลายอย่าง (กระทู้) กำลังดิ้นรนสำหรับทรัพยากรเดียวกันทีละครั้ง เมธอด wait เมื่อเรียกใช้มันจะปลดล็อกบนวัตถุที่เรียกใช้เมธอดการรอ และให้โอกาสกับวัตถุอื่นในการดำเนินการจนกว่าจะมีการเรียกใช้วิธีการแจ้งเตือนซึ่งจะดำเนินการล็อควัตถุที่ปล่อยออกมาโดยวิธีการรอต่อไป วิธีการรอมีรูปแบบดังต่อไปนี้
รอ(); รอ (มิลลิวินาทียาว); รอ (มิลลิวินาทียาว int nanosecond);
ในวิธีการรอสามรูปแบบข้างต้นวิธีแรกไม่มีพารามิเตอร์เวลาหมายความว่าการดำเนินการของวิธีการรอจะดำเนินต่อไปจนกว่าจะมีการแจ้งเตือนหรือวิธีการแจ้งเตือนทั้งหมดไม่ถูกเรียกใช้ ส่วนที่เหลือสองวิธีมีพารามิเตอร์เวลา ดังนั้นพวกเขาจะดำเนินการจนกว่าเวลาจะหมดอายุหรือจนกว่าจะแจ้งให้ทราบหรือวิธี noitfyAll ถูกเรียกใช้ก่อนหน้านี้เวลาหมดอายุ วิธีการรอสามารถส่งข้อยกเว้น IllegalArgumentException ถ้าอาร์กิวเมนต์เวลาที่ส่งผ่านเป็นค่าลบ IllegalMonitorStateException หากเธรดปัจจุบันไม่ได้ใช้ทรัพยากร InterruptedException หากวิธีการรอถูกขัดจังหวะ
ความแตกต่างที่สำคัญระหว่างวิธี Sleep และ Wait ใน Java
- จุดหลักที่แยกความแตกต่างของวิธีการนอนหลับและรอคือวิธีนอนหลับเก็บล็อควัตถุจนกว่าจะถูกขัดจังหวะหรือเวลาหมดอายุ อย่างไรก็ตามวิธีการรอปล่อยล็อคในวัตถุที่เรียกมันและให้วัตถุอื่น ๆ มีโอกาสที่จะดำเนินการ
- เมธอด sleep ถูกกำหนดในคลาส Thread ขณะที่เมธอด wait ถูกกำหนดไว้ในคลาส Object
- เมธอด sleep ไม่จำเป็นต้องถูกเรียกจากบริบทที่ซิงโครไนซ์ แต่ต้องรอวิธีการรอจากการซิงโครไนซ์
- เมธอด sleep ถูกปลุกให้ตื่นหากเวลาของเมธอดหมดอายุหรือถูกขัดจังหวะโดยเธรดอื่น วิธีการรอคอยถูกปลุกให้ตื่น
เมื่อมีการเรียกใช้เมธอด แจ้ง หรือ แจ้งเตือน ทั้งหมด - วิธีสลีปเป็นวิธีส แตติก ขณะที่วิธีการรอ ไม่ใช่ วิธีส แตติก
- เมธอด sleep ถูกเรียกใช้งานบนเธรดปัจจุบันในขณะที่เมธอด wait ถูกเรียกใช้งานบนอ็อบเจ็กต์ที่เรียกใช้งาน
- ข้อยกเว้นที่เกิดจากวิธีการนอนหลับคือ InterruptedException ในขณะที่ข้อยกเว้น thrwon โดยวิธีรอคือ IllegalArgumentException, IllegalMonitorStateException, InterruptedException
สรุป:
เมื่อหลายเธรดต้องการใช้ทรัพยากรเดียวกันทีละรายการต้องใช้วิธีการรอ เมื่อเธรดไม่ต้องการทำงานใด ๆ ต้องใช้วิธีการสลีป