วัตถุประสงค์ของการสื่อสารเธรดคือการเปิดใช้งานเธรดเพื่อส่งสัญญาณไปซึ่งกันและกัน นอกจากนี้การสื่อสารเธรดยังสามารถทำให้เธรดรอสัญญาณจากเธรดอื่น ๆ ตัวอย่างเช่นเธรด B สามารถรอสัญญาณจากเธรด A ซึ่งอาจเป็นสัญญาณที่เธรด A ได้ประมวลผลและเสร็จสิ้น
รอ () วิธีการ
- ขัดจังหวะการดำเนินการของวิธีการทำให้เธรดนี้รอชั่วคราวให้สิทธิ์ในการใช้ CPU ชั่วคราวและอนุญาตให้เธรดอื่นใช้วิธีการซิงโครไนซ์นี้
แจ้ง () วิธีการ
-รอคอยที่ปลายเธรดรอเนื่องจากการใช้งานปาร์ตี้แบบซิงโครนัสนี้
วิธีการแจ้งเตือน ()
ปลุกเธรดทั้งหมดที่รอการสิ้นสุดของการรอคอยเนื่องจากการใช้วิธีการซิงโครไนซ์นี้
เมื่อใดควรใช้วิธีการรอ
เมื่อใช้ตัวแปรในวิธีการซิงโครไนซ์ที่ใช้โดยเธรดและตัวแปรนี้จะต้องมีการแก้ไขโดยเธรดอื่นเพื่อตอบสนองความต้องการของเธรดนี้จากนั้นคุณสามารถใช้วิธีการรอ () ในวิธีการซิงโครไนซ์
ที่นี่ฉันจะยกตัวอย่างในชั้นเรียนเป็นตัวอย่างเพื่ออธิบายบทบาทของการรอคอยและแจ้งสั้น ๆ
เรารู้อยู่แล้วว่าในมัลติเธรดเช่นการขายตั๋วลำดับของตั๋วที่ขายในแต่ละหน้าต่างนั้นสุ่ม หากเรามีหน้าต่างขายตั๋ว 2 ใบจะต้องระบุว่าจะต้องขายตั๋ว 100 ใบในทางกลับกัน หลังจากขายตั๋วหนึ่งใบใน Window A ตั๋วถัดไปจะต้องขายโดย Window B. เราจะใช้ฟังก์ชั่นนี้ได้อย่างไร
ก่อนอื่นฉันคิดว่าถ้าสามารถตั้งค่าคำสั่ง ถ้า (i%2 == 0) จากนั้นเธรด 1 จะรันมิฉะนั้นเธรด 2 จะรัน แต่การรันของเธรด 1 และเธรด 2 นั้นเป็นแบบสุ่มและไม่สามารถระบุได้เพื่อกำหนดว่าใครทำงานตามขนาดของ i
จากนั้นเราสามารถใช้ wait () และแจ้ง () ในเธรด
หลังจากที่เธรด 1 เสร็จสิ้นให้รอสักครู่จากนั้นเธรด 2 กำลังทำงานอยู่และหลังจากที่เธรด 2 เสร็จสิ้นจากนั้นปลุกเธรด 1 จากนั้นอีกครั้ง
หลังจากเธรด 1 เสร็จแล้วให้รอสักครู่จากนั้นเธรด 2 จะรันและหลังจากที่เธรด 2 เสร็จสิ้นจากนั้นปลุกเธรด 1
ด้วยวิธีนี้เธรด 1 และเธรด 2 สามารถทำงานได้ในทางกลับกัน
เราได้พิมพ์ตัวเลข 10 ตัวเป็นตัวอย่างในการเขียนโปรแกรมและสร้างทั้งหมด 2 คลาส MyPrint และ MyPrinttest
myprint.java
คลาสสาธารณะ MyPrint ใช้งาน Runnable {Private int i = 0; @Override โมฆะสาธารณะเรียกใช้ () {ลอง {print ();} catch (interruptedException e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printStackTrace ();}} interruptedException {ในขณะที่ (i <10) {system.out.println (thread.currentthread (). getName ()+":"+i); i ++; แจ้ง (); ลอง {รอ ();} catch (interruptedexception e)ผลลัพธ์จะแสดงในรูป
คุณจะเห็นว่าเธรด 1 และเธรด 2 ถูกนำมาใช้เพื่อพิมพ์สลับกัน
เพียงแค่เข้าใจกระบวนการทำงาน
ในขณะที่ (i <10) {system.out.println (thread.currentThread (). getName ()+":"+i); i ++; notify (); ลอง {wait ();} catch (interruptedException e) {e.printstacktrace ();}}}}}เมื่อฉัน <10 พิมพ์เธรด 1 จากนั้นทำการปลุก เนื่องจากไม่มีเธรดด้านหน้าขั้นตอนนี้จึงไม่ถูกดำเนินการ จากนั้นเธรด 1 รอ หลังจากดำเนินการเธรด 2 ตื่นขึ้นมาเธรดก่อนหน้าเช่นเธรด 1 จากนั้นพิมพ์เธรด 1
กระบวนการนี้จะดำเนินต่อไปจนกว่าลูปจะแตกออกดังนั้นเราจึงสามารถทำการหมุนได้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการพูดคุยสั้น ๆ เกี่ยวกับบทบาทของการรอคอยและแจ้งในการสื่อสารเธรด ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!