BlockingQueue ใน Java คืออะไรและจะใช้งานได้อย่างไร?



บทความเกี่ยวกับ BlockingQueue ใน Java นี้จะช่วยให้คุณเรียนรู้เกี่ยวกับอินเทอร์เฟซ BlockingQueue นอกจากนี้ยังจะให้ข้อมูลเชิงลึกเกี่ยวกับวิธีการและการนำไปใช้จริง

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

ด้านล่างนี้เป็นหัวข้อที่กล่าวถึงในบทความนี้:





BlockingQueue Interface ใน Java

BlockingQueue ใน Java เป็นอินเทอร์เฟซที่เพิ่มเข้ามาใน Java 1.5 พร้อมกับคลาส Utility อื่น ๆ ที่ทำงานพร้อมกันเช่น ConcurrentHashMap, CopyOnWriteArrrayList เป็นต้นอินเตอร์เฟส BlockingQueue เป็นของ java.util.concurrent แพ็คเกจ .อินเทอร์เฟซนี้ช่วยเพิ่มการควบคุมโฟลว์โดยการเปิดใช้งานการบล็อกในกรณีที่เธรดพยายามยกเลิกคิวคิวว่างหรือจัดคิวเต็ม ไม่ว่าในกรณีใดอินเทอร์เฟซนี้มีประโยชน์ในแง่ที่ง่ายกว่านั้นสมมติว่าก กำลังพยายามเพิ่มองค์ประกอบลงในคิวเต็มแล้ว ณ จุดนี้ในโปรแกรม BlockingQueue จะถูกเรียกใช้ซึ่งจะบล็อกเธรดนั้น ๆ จนกว่าเธรดอื่นจะปล่อยคิวเพื่อสร้างพื้นที่ ซึ่งอาจเป็นผลมาจากการยกเลิกการจัดคิวองค์ประกอบของการเคลียร์คิวทั้งหมด ในทำนองเดียวกัน BlockingQueue จะถูกเรียกใช้เพื่อบล็อกเธรดที่พยายามยกเลิกคิวที่ว่างอยู่แล้วจนกว่าเธรดอื่นจะแทรกหรือเพิ่มองค์ประกอบลงในช่องว่าง คิว .

ควรใช้เมื่อใด ใน java

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



BlockingQueue - BlockingQueue ใน Java - Edurekaนี้ อินเตอร์เฟซ ส่วนใหญ่จะใช้ระหว่าง Producer-Consumers เนื่องจากเป็น Thread-Safeสิ่งที่ฉันหมายถึงคืออินเทอร์เฟซ BlockingQueue สามารถใช้เพื่อสร้างคิวที่สามารถใช้ร่วมกันได้ทั้งผู้ผลิตและผู้บริโภค

ในการทำงานกับ BlockingQueue ใน Java ก่อนอื่นคุณต้องทำความคุ้นเคยกับประเภทของมัน ให้ฉันแนะนำคุณให้รู้จักในส่วนถัดไปของบทความนี้

ประเภทของตัวสร้างสำหรับ BlockingQueue ใน Java

มีตัวสร้างสองประเภทสำหรับอินเตอร์เฟส BlockingQueue ใน Java:



การผสมข้อมูลบนโต๊ะไม่ทำงาน
  • คิวที่ไม่ผูกมัด: สำหรับคิวประเภทนี้ความจุจะถูกตั้งค่าเป็น Integer.MAX_VALUE คิวที่ไม่ถูกผูกไว้จะไม่ถูกบล็อกเนื่องจากสามารถเติบโตแบบไดนามิกทุกครั้งที่มีการแทรกองค์ประกอบลงในคิว ด้านล่างนี้คือไวยากรณ์สำหรับสร้างคิวที่ไม่ถูกผูกไว้:
BlockingQueue bq = LinkedBlockingDeque ใหม่ ()
  • คิวที่ถูกผูกไว้: สำหรับคิวประเภทนี้คุณจะต้องส่งผ่านความจุของคิวในขณะที่สร้างเช่นเป็น ผู้สร้าง พารามิเตอร์. เมื่อกำหนดขนาดแล้วจะไม่สามารถเปลี่ยนแปลงได้ ด้านล่างนี้คือไวยากรณ์สำหรับสร้างคิวที่มีขอบเขต:
BlockingQueue bq = LinkedBlockingDeque ใหม่ (10)

เมื่อคุณคุ้นเคยกับวิธีการใช้งาน BlockingQueue ใน Java แล้วให้ฉันระบุวิธีการบางอย่าง

วิธีการใน BlockingQueue Interface

วิธี คำอธิบาย
บูลีนเพิ่ม (E e) วิธีนี้ช่วยในการแทรกองค์ประกอบที่ระบุลงในคิวนี้หากมีที่ว่างในคิวอื่นก็จะโยนIllegalStateException
บูลีนประกอบด้วย (Object o) วิธีนี้จะคืนค่าจริงหากคิวมีองค์ประกอบที่ระบุ
int drainTo (คอลเลกชัน c) วิธีนี้จะลบองค์ประกอบที่มีอยู่ทั้งหมดออกจากคิวและเพิ่มลงในคอลเล็กชันที่ระบุ
int drainTo (คอลเลกชัน c, int maxElements) วิธีนี้จะลบองค์ประกอบที่มีอยู่ตามจำนวนที่กำหนดจากคิวและเพิ่มลงในที่ระบุ
ข้อเสนอ booloean (E e) วิธีนี้จะแทรกองค์ประกอบที่ระบุลงในคิวหากยังไม่เต็มและส่งคืนจริงมิฉะนั้นจะส่งคืนเท็จ
ข้อเสนอบูลีน (E e, long timeout, TimeUnit unit) วิธีนี้จะแทรกองค์ประกอบที่ระบุลงในคิว ในกรณีที่คิวเต็มคิวจะต้องรอจนถึงเวลาที่กำหนดเพื่อให้พื้นที่ว่าง
E แบบสำรวจ (หมดเวลานานหน่วย TimeUnit) วิธีนี้ช่วยในการดึงและลบส่วนหัวของคิว ในกรณีที่คิวว่างคิวจะรอจนถึงเวลาที่กำหนดเพื่อให้องค์ประกอบพร้อมใช้งาน
โมฆะใส่ (E e) วิธีนี้จะแทรกองค์ประกอบที่ระบุลงในคิวโดยรอให้มีพื้นที่ว่าง n ในกรณีที่คิวเต็ม
int ที่เหลืออยู่ วิธีนี้ช่วยในการส่งคืนจำนวนองค์ประกอบเพิ่มเติมที่คิวนี้สามารถยอมรับได้โดยไม่ต้องถูกบล็อก
บูลีนลบ (Object o) วิธีนี้จะลบอินสแตนซ์เดียวขององค์ประกอบที่ระบุออกจากคิวก็ต่อเมื่อมีอยู่
E ใช้เวลา () วิธีนี้จะช่วยในการดึงและลบส่วนหัวของคิวโดยรอให้องค์ประกอบพร้อมใช้งานในกรณีที่คิวว่างเปล่า

การปิดกั้นการใช้งานคิว

ที่นี่ฉันจะนำตัวอย่างง่ายๆของ BlockingQueue ไปใช้ใน Java โดยที่คลาส EduProducer จะสร้างข้อมูลและแทรกลงในไฟล์ คิว ในขณะเดียวกันคลาสอื่น EduConsumer จะลบข้อมูลออกจากคิวเดียวกัน

สำหรับสิ่งนี้ฉันจะสร้าง 3 คลาส ได้แก่ :

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

มาสร้างชั้นเรียนเหล่านี้ทีละชั้น

EduProducer.java

แพคเกจ edureka import java.util.concurrent.BlockingQueue คลาสสาธารณะ EduProducer ดำเนินการ Runnable {private final BlockingQueue que @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () พ่น InterruptedException {// ใส่ 10 ints ลงใน Queue for (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

package edureka import java.util.concurrent.BlockingQueue คลาสสาธารณะ EduConsumer ดำเนินการ Runnable {private final BlockingQueue que @Override public void run () {try {while (true) {Integer take = que.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). interrupt ()}} private void process (Integer take) พ่น InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (คิว BlockingQueue) {this.queue = que}}

EdurekaMain.java

package edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue คลาสสาธารณะ EdurekaMain {public static void main (String [] args) {BlockingQueue que = new LinkedBlockingQueue (10) new Thread (new EduProducer (que)) .start () เธรดใหม่ (EduConsumer ใหม่ (คิว)). start ()}}

เมื่อคุณเขียนโค้ดเสร็จแล้วให้รันโปรแกรมเพื่อรับผลลัพธ์ด้านล่าง:

วิธีเปลี่ยน double เป็น int ใน java
[Producer] เพิ่ม: 0 [Consumer] Take: 0 [Producer] Queue's Remaining Capacity: 9 [Producer] Add: 1 [Producer] Queue's Remaining Capacity: 9 [Producer] Add: 2 [Producer] Queue's Remaining Capacity: 8 [Producer ] เพิ่ม: 3 [ผู้ผลิต] ความจุที่เหลือของคิว: 7 [ผู้บริโภค] รับ: 1 [ผู้ผลิต] เพิ่ม: 4 [ผู้ผลิต] ความจุที่เหลือของคิว: 7 [ผู้ผลิต] เพิ่ม: 5 [ผู้ผลิต] ความจุที่เหลือของคิว: 6 [ผู้ผลิต] เพิ่ม : 6 [Producer] ความจุที่เหลืออยู่ของคิว: 5 [ผู้บริโภค] รับ: 2 [ผู้ผลิต] เพิ่ม: 7 [ผู้ผลิต] ความจุที่เหลืออยู่ของคิว: 5 [ผู้ผลิต] เพิ่ม: 8 [ผู้ผลิต] ความจุที่เหลือของคิว: 4 [ผู้ผลิต] เพิ่ม: 9 [ผู้ผลิต] ความจุที่เหลืออยู่ของคิว: 3 [ผู้บริโภค] รับ: 3 [ผู้บริโภค] รับ: 4 [ผู้บริโภค] รับ: 5 [ผู้บริโภค] รับ: 6 [ผู้บริโภค] รับ: 7 [ผู้บริโภค] รับ: 8 [ผู้บริโภค] รับ: 9

เรามาถึงตอนท้ายของบทความนี้เกี่ยวกับ BlockingQueue ใน Java หากคุณต้องการเรียนรู้ Java โดยละเอียดคุณสามารถอ้างอิงได้จาก เช่นกัน.

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

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของ 'BlockingQueue ใน Java' และเราจะติดต่อกลับโดยเร็วที่สุด