Wait and Notify ใน Java คืออะไร?



Wait and Notify ใน Java เป็นสองวิธีสุดท้ายที่อนุญาตให้เธรดสื่อสารกันได้ บทความนี้จะช่วยให้คุณมีรายละเอียด

คุณลักษณะใน Java ช่วยให้สามารถดำเนินการสองส่วนของโปรแกรมพร้อมกันได้ แต่ละส่วนเป็นเธรด เธรดเหล่านี้มักจะต้องประสานการกระทำของพวกเขา ทำได้โดยใช้วิธีการขั้นสุดท้ายสองสามอย่างเช่น Wait and Notify ใน Java บทความนี้จะช่วยให้คุณเข้าใจวิธีการเหล่านี้โดยละเอียด

ฉันจะพูดถึงหัวข้อตามลำดับต่อไปนี้:





เอาล่ะ!

Thread Synchronization คืออะไร?

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



ตอนนี้พูดถึง Polling. การสำรวจความคิดเห็นเป็นกระบวนการทดสอบเงื่อนไขซ้ำ ๆ จนกว่าจะเป็นจริง วิธีนี้ดำเนินการด้วยความช่วยเหลือของ เพื่อตรวจสอบว่าเงื่อนไขใดเป็นจริงหรือไม่ คุณสามารถใช้วิธีนี้สำหรับเธรด แต่วิธีนี้ทำให้สิ้นเปลืองรอบของ CPU มากและยัง ทำให้กระบวนการดำเนินการไม่มีประสิทธิภาพมาก เพื่อหลีกเลี่ยงข้อบกพร่องประเภทนี้แนะนำวิธีการเช่น Wait and Notify ใน Java

Wait () และ Notify () คืออะไร?

ในการแก้ไขปัญหามัลติเธรดให้ใช้วิธีการเช่น Wait and Notify in ใช้ คลาสอ็อบเจ็กต์ใช้สามวิธีสุดท้ายที่อนุญาตให้เธรดสื่อสารเกี่ยวกับสถานะที่ถูกล็อกของรีซอร์ส พวกเขาเรียกอีกอย่างว่า Guarded Blocks

การแคสต์ประเภทข้อมูลใน java

รอ()

วิธีนี้จะทำให้เธรดรอจนกว่าเธรดอื่นจะเรียกใช้เมธอด alert () และ informAll () สำหรับอ็อบเจ็กต์นี้ วิธี Wait () นี้จะบอกให้เธรดการโทรออกจากการล็อกและเข้าสู่โหมดสลีปจนกว่าเธรดอื่นจะเข้าสู่จอภาพเดียวกันและโทรแจ้ง () วิธีนี้จะคลายล็อกก่อนที่จะรอและรับการล็อกอีกครั้งก่อนที่จะกลับจากเมธอด wait ()



วิธี Wait () ถูกรวมเข้ากับล็อคการซิงโครไนซ์อย่างแน่นหนา สิ่งนี้ทำได้โดยใช้คุณสมบัติที่ไม่มีให้โดยตรงจากกลไกการซิงโครไนซ์

ไวยากรณ์:

ซิงโครไนซ์ (lockObject) {while (! condition) {lockObject.wait ()} // ดำเนินการที่นี่}

เธรดปัจจุบันต้องเป็นเจ้าของจอภาพของวัตถุนั้น ต้องเรียกใช้จากวิธีการซิงโครไนซ์เท่านั้นมิฉะนั้นจะทำให้เกิดข้อยกเว้น

แจ้ง()

วิธีนี้ใช้เพื่อแจ้งไฟล์ ที่จำเป็นในการทำงาน มันตื่นขึ้นมาหนึ่งหัวข้อที่เรียกว่า รอ() วิธีการบนวัตถุเดียวกัน

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

ไวยากรณ์:

ซิงโครไนซ์ (lockObject) {// earn_the_condition lockObject.notify () // รหัสเพิ่มเติมหากจำเป็น}

แจ้งเตือนทั้งหมด ()

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

เหตุใดจึงต้องใช้ Wait () และ Notify () ใน Java

คุณควรใช้ Wait and Notify in เนื่องจากเกี่ยวข้องกับการล็อกและวัตถุมีการล็อก แม้ว่าการรอและแจ้งเตือนใน Java จะเป็นแนวคิดพื้นฐาน แต่ก็มีการกำหนดไว้ในไฟล์ คลาสออบเจ็กต์ . น่าแปลกใจที่การเขียนโค้ดโดยใช้การรอและแจ้งเตือนนั้นไม่ใช่เรื่องง่าย คุณสามารถทดสอบสิ่งนี้ได้โดยเขียนโค้ดเพื่อแก้ปัญหาผู้ผลิต - ผู้บริโภคโดยใช้การรอและแจ้ง ตัวอย่างผู้บริโภคผู้ผลิต - รอและแจ้งใน Java-Edurekaที่นี่ฉันมีการแบ่งปัน คิว และสองเธรดเรียกว่า โปรดิวเซอร์ และ ผู้บริโภค . โปรดิวเซอร์ thread ใส่หมายเลขลงในคิวที่ใช้ร่วมกันและ ผู้บริโภค เธรดใช้ตัวเลขจากที่เก็บข้อมูลที่ใช้ร่วมกัน

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

บันทึก : ว.ait และ Noวิธีการ tify ถูกกำหนดไว้ในคลาสอ็อบเจ็กต์และจะต้องถูกเรียกภายในบล็อกที่ซิงโครไนซ์

ตัวอย่าง

คลาสสาธารณะ Thread1 {public static void main (String [] args) {Thread2 b = new Thread2 () b.start () synchronized (b) {try {System.out.println ('Waiting for 2 to complete ... ' ) b.wait ()} catch (InterruptedException e) {e.printStackTrace ()} System.out.println ('Total is:' + b.total)}}} class Thread2 ขยาย Thread1 {int total @Override public void run () {ซิงโครไนซ์ (นี้) {สำหรับ (int i = 0 i<=100 i++) { total += i } notify() }}}

สังเกตว่าในตัวอย่างข้างต้นออบเจ็กต์ของ Thread2 นั่นคือ b จะซิงโครไนซ์ b จะทำการคำนวณให้เสร็จสิ้นก่อนที่เธรดหลักจะส่งออกค่ารวม

เอาท์พุต:

สิ่งนี้ทำให้เรามาถึงตอนท้ายของบทความนี้ซึ่งเราได้เรียนรู้ไฟล์ บน Wait and Notify ใน Javaฉันหวังว่าเนื้อหาดังกล่าวข้างต้นได้รับการพิสูจน์แล้วว่ามีประโยชน์ในการปรับปรุง ความรู้. อ่านต่อไปสำรวจต่อไป!

ตรวจสอบด้วย โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ออกแบบมาสำหรับนักเรียนและผู้เชี่ยวชาญที่ต้องการเป็น Java Developer หลักสูตรนี้ออกแบบมาเพื่อให้คุณเริ่มต้นการเขียนโปรแกรม Java และฝึกอบรมแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับแนวคิดต่างๆ เช่น Hibernate & Spring