ความแตกต่างระหว่าง Wait และ Sleep ใน Java

1. ภาพรวม

ในบทความสั้น ๆ นี้เราจะมาดู standard sleep ()และwait () method ใน core Java และทำความเข้าใจความแตกต่างและความคล้ายคลึงกัน

2. ความแตกต่างทั่วไประหว่างการรอและการนอนหลับ

ใส่เพียงแค่wait ()เป็นวิธีการอินสแตนซ์ที่ใช้สำหรับการซิงโครไนซ์เธรด

สามารถเรียกใช้กับวัตถุใดก็ได้ตามที่กำหนดไว้บนjava.lang.Objectแต่สามารถเรียกได้จากบล็อกที่ซิงโครไนซ์เท่านั้น มันคลายการล็อกบนวัตถุเพื่อให้เธรดอื่นสามารถกระโดดเข้ามาและได้รับการล็อค

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

ต่อไปนี้เป็นรูปลักษณ์เบื้องต้นที่ง่ายมากสำหรับการทำงานของ API หลักทั้งสองนี้:

private static Object LOCK = new Object(); private static void sleepWaitExamples() throws InterruptedException { Thread.sleep(1000); System.out.println( "Thread '" + Thread.currentThread().getName() + "' is woken after sleeping for 1 second"); synchronized (LOCK) { LOCK.wait(1000); System.out.println("Object '" + LOCK + "' is woken after" + " waiting for 1 second"); } } 

การรันตัวอย่างนี้จะให้ผลลัพธ์ดังต่อไปนี้:

เธรด 'main' ถูกปลุกหลังจากนอนหลับไป 1 วินาที

ออบเจ็กต์ '[email protected]' ถูกปลุกหลังจากรอ 1 วินาที

3. ตื่นขึ้นมารอและนอนหลับ

เมื่อเราใช้เมธอดsleep ()เธรดจะเริ่มทำงานหลังจากช่วงเวลาที่กำหนดเว้นแต่จะถูกขัดจังหวะ

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

ใช้alertAll ()แทนการแจ้งเตือน ()เมื่อคุณต้องการปลุกเธรดทั้งหมดที่อยู่ในสถานะรอ ในทำนองเดียวกันกับการรอคอย ()วิธีการของตัวเองแจ้ง ()และnotifyAll ()จะต้องมีการเรียกจากบริบทตรงกัน

ตัวอย่างเช่นคุณสามารถรอได้ดังนี้

synchronized (b) { while (b.sum == 0) { System.out.println("Waiting for ThreadB to complete..."); b.wait(); } System.out.println("ThreadB has completed. " + "Sum from that thread is: " + b.sum); }

จากนั้นต่อไปนี้เป็นวิธีที่เธรดอื่นสามารถปลุกเธรดที่รอคอย - โดยการโทรแจ้ง ()บนจอภาพ :

int sum; @Override public void run() { synchronized (this) { int i = 0; while (i < 100000) { sum += i; i++; } notify(); } }

การรันตัวอย่างนี้จะให้ผลลัพธ์ดังต่อไปนี้:

กำลังรอให้ ThreadB เสร็จสมบูรณ์ ...

ThreadB เสร็จสมบูรณ์ ผลรวมจากเธรดนั้นคือ 704982704

4. สรุป

นี่คือไพรเมอร์ฉบับย่อสำหรับความหมายของการรอและการนอนหลับใน Java

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

เช่นเคยคุณสามารถดูตัวอย่างที่ให้ไว้ในบทความนี้ได้ที่ GitHub