แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

ความแตกต่างระหว่างวิธี sleep () และ wait () ใน Java

วิธีการนอนหลับและรอฟังดูเหมือนจะทำงานเดียวกัน แต่พวกเขาแตกต่างกันมาก เมธอด Sleep เป็นของคลาส Thread และเมธอด wait เป็นของ Object Object ความแตกต่างที่สำคัญที่สุดที่แยกความแตกต่างของทั้งคู่ก็คือวิธีการสลีปจะล็อควัตถุไว้จนกว่าจะถูกขัดจังหวะหรือเสร็จสิ้นการปฏิบัติ ในทางกลับกันวิธีการ รอ ปล่อยล็อคบนวัตถุเพื่อให้วัตถุอื่นดำเนินการจนถึงจะกลับมาทำงานต่อโดยวิธีการแจ้งเตือน มีความแตกต่างเพิ่มเติมระหว่างวิธีการนอนหลับและวิธีรอ คุณสามารถสำรวจได้ในตารางเปรียบเทียบที่แสดงด้านล่าง

แผนภูมิเปรียบเทียบ

พื้นฐานสำหรับการเปรียบเทียบนอนรอ
ขั้นพื้นฐานวิธีสลีปไม่ปล่อยล็อควัตถุจนกว่าจะถูกขัดจังหวะวิธีการรอปล่อยล็อคบนวัตถุเพื่อให้วัตถุอื่นดำเนินการจนกว่าการแจ้งเตือนหรือแจ้งให้ทราบวิธีการทั้งหมดจะถูกเรียก
ชั้นวิธีการนอนหลับถูกกำหนดไว้ในระดับกระทู้มีการกำหนดเมธอด Wait ในคลาส Object
Synchronizedไม่จำเป็นต้องเรียกใช้เมธอด Sleep ภายในบริบทที่ซิงโครไนซ์ต้องรอวิธีเรียกใช้ภายในบริบทที่ซิงโครไนซ์
เสร็จสิ้นการดำเนินการกับโหมดสลีปจะเสร็จสมบูรณ์เมื่อเธรดขัดจังหวะหรือเวลาของโหมดสลีปหมดอายุการรอการประมวลผลเมธอดเสร็จสมบูรณ์เมื่อการแจ้งเตือน () หรือการแจ้งเตือนทั้งหมด () ขัดจังหวะวิธีการนั้น
คงที่วิธีสลีปเป็นวิธีสแตติกวิธีการรอไม่คงที่นั่นคือสาเหตุที่มันต้องการวัตถุที่จะเรียกมัน
การกระทำเมธอด sleep ถูกเรียกใช้งานบนเธรดปัจจุบันวิธีการรอดำเนินการบนวัตถุ
ข้อยกเว้นInterruptedExceptionIllegalArgumentException, IllegalMonitorStateException, InterruptedException

ความหมายของวิธีการนอนหลับ

เมธอด sleep เป็นวิธีส แตติก ของคลาส Thread เมธอด sleep ถูกเรียกใช้เมื่อเธรดไม่ต้องการทำงานใด ๆ ตามระยะเวลาที่กำหนด เมธอด sleep เสร็จสิ้นการเรียกใช้งานเมื่อเวลาของเมธอดหมดอายุหรือถูกขัดจังหวะโดยเธรดอื่นในการเรียกใช้งาน หลังจากเมธอด sleep เสร็จสิ้นเธรดจะได้รับสถานะที่รันได้อีกครั้ง วิธีการนอนหลับมีสองวิธีดังแสดงด้านล่าง

 ประชาชนโมฆะพื้นเมืองคงนอนหลับ (มิลลิวินาทียาว); โมฆะคงที่สาธารณะการนอนหลับ (มิลลิวินาทียาวและ int nanosecond); 

ในสองรูปแบบข้างต้นคุณสามารถสังเกตเวลาที่กล่าวถึงทั้งในรูปแบบของวิธีการนอนหลับ นี่เป็นเพราะเธรดสลีปเสมอสำหรับเวลาเฉพาะที่กล่าวถึงในพารามิเตอร์ เมธอด sleep สามารถถูกขัดจังหวะโดยเธรดอื่น ๆ ในระหว่างการประมวลผล ด้วยเหตุนี้มันสามารถโยนการขัดจังหวะโดย Execption คุณต้องระมัดระวังว่าข้อยกเว้นนั้นได้รับการจัดการทั้งโดยลอง / จับบล็อกหรือโดยการโยนคำหลักมิฉะนั้นจะทำให้เกิดข้อผิดพลาดในเวลารวบรวม เมธอด sleep เก็บล็อกบนวัตถุปัจจุบันในการดำเนินการและไม่อนุญาตให้วัตถุอื่นดำเนินการจนกว่าจะเสร็จสิ้นการดำเนินการ

ความหมายของวิธีการรอ

รอเป็นวิธีการที่กำหนดไว้ในคลาส วัตถุ วิธีการรอจะใช้เมื่องานหลายอย่าง (กระทู้) กำลังดิ้นรนสำหรับทรัพยากรเดียวกันทีละครั้ง เมธอด wait เมื่อเรียกใช้มันจะปลดล็อกบนวัตถุที่เรียกใช้เมธอดการรอ และให้โอกาสกับวัตถุอื่นในการดำเนินการจนกว่าจะมีการเรียกใช้วิธีการแจ้งเตือนซึ่งจะดำเนินการล็อควัตถุที่ปล่อยออกมาโดยวิธีการรอต่อไป วิธีการรอมีรูปแบบดังต่อไปนี้

 รอ(); รอ (มิลลิวินาทียาว); รอ (มิลลิวินาทียาว int nanosecond); 

ในวิธีการรอสามรูปแบบข้างต้นวิธีแรกไม่มีพารามิเตอร์เวลาหมายความว่าการดำเนินการของวิธีการรอจะดำเนินต่อไปจนกว่าจะมีการแจ้งเตือนหรือวิธีการแจ้งเตือนทั้งหมดไม่ถูกเรียกใช้ ส่วนที่เหลือสองวิธีมีพารามิเตอร์เวลา ดังนั้นพวกเขาจะดำเนินการจนกว่าเวลาจะหมดอายุหรือจนกว่าจะแจ้งให้ทราบหรือวิธี noitfyAll ถูกเรียกใช้ก่อนหน้านี้เวลาหมดอายุ วิธีการรอสามารถส่งข้อยกเว้น IllegalArgumentException ถ้าอาร์กิวเมนต์เวลาที่ส่งผ่านเป็นค่าลบ IllegalMonitorStateException หากเธรดปัจจุบันไม่ได้ใช้ทรัพยากร InterruptedException หากวิธีการรอถูกขัดจังหวะ

ความแตกต่างที่สำคัญระหว่างวิธี Sleep และ Wait ใน Java

  1. จุดหลักที่แยกความแตกต่างของวิธีการนอนหลับและรอคือวิธีนอนหลับเก็บล็อควัตถุจนกว่าจะถูกขัดจังหวะหรือเวลาหมดอายุ อย่างไรก็ตามวิธีการรอปล่อยล็อคในวัตถุที่เรียกมันและให้วัตถุอื่น ๆ มีโอกาสที่จะดำเนินการ
  2. เมธอด sleep ถูกกำหนดในคลาส Thread ขณะที่เมธอด wait ถูกกำหนดไว้ในคลาส Object
  3. เมธอด sleep ไม่จำเป็นต้องถูกเรียกจากบริบทที่ซิงโครไนซ์ แต่ต้องรอวิธีการรอจากการซิงโครไนซ์
  4. เมธอด sleep ถูกปลุกให้ตื่นหากเวลาของเมธอดหมดอายุหรือถูกขัดจังหวะโดยเธรดอื่น วิธีการรอคอยถูกปลุกให้ตื่น
    เมื่อมีการเรียกใช้เมธอด แจ้ง หรือ แจ้งเตือน ทั้งหมด
  5. วิธีสลีปเป็นวิธีส แตติก ขณะที่วิธีการรอ ไม่ใช่ วิธีส แตติก
  6. เมธอด sleep ถูกเรียกใช้งานบนเธรดปัจจุบันในขณะที่เมธอด wait ถูกเรียกใช้งานบนอ็อบเจ็กต์ที่เรียกใช้งาน
  7. ข้อยกเว้นที่เกิดจากวิธีการนอนหลับคือ InterruptedException ในขณะที่ข้อยกเว้น thrwon โดยวิธีรอคือ IllegalArgumentException, IllegalMonitorStateException, InterruptedException

สรุป:

เมื่อหลายเธรดต้องการใช้ทรัพยากรเดียวกันทีละรายการต้องใช้วิธีการรอ เมื่อเธรดไม่ต้องการทำงานใด ๆ ต้องใช้วิธีการสลีป

Top