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