เป็นที่นิยมอย่างมากในหมู่โปรแกรมเมอร์เนื่องจากมีคุณสมบัติในตัวที่ครอบคลุม ส่วนใหญ่คุณจะมีวิธีแก้ปัญหาเฉพาะสำหรับปัญหาของคุณก่อนที่จะเกิดขึ้น เป็นส่วนที่มีประโยชน์และสำคัญอย่างยิ่ง คืออินเตอร์เฟส BlockingQueue ใน Java ผ่านสื่อกลางของบทความนี้ฉันจะให้ความสำคัญกับ BlockingQueue ใน Java และวิธีการใช้งาน
ด้านล่างนี้เป็นหัวข้อที่กล่าวถึงในบทความนี้:
- BlockingQueue Interface ใน Java
- ประเภทของตัวสร้างสำหรับ BlockingQueue ใน Java
- วิธีการใน BlockingQueue Interface
- การปิดกั้นการใช้งานคิว
BlockingQueue Interface ใน Java
BlockingQueue ใน Java เป็นอินเทอร์เฟซที่เพิ่มเข้ามาใน Java 1.5 พร้อมกับคลาส Utility อื่น ๆ ที่ทำงานพร้อมกันเช่น ConcurrentHashMap, CopyOnWriteArrrayList เป็นต้นอินเตอร์เฟส BlockingQueue เป็นของ java.util.concurrent แพ็คเกจ .อินเทอร์เฟซนี้ช่วยเพิ่มการควบคุมโฟลว์โดยการเปิดใช้งานการบล็อกในกรณีที่เธรดพยายามยกเลิกคิวคิวว่างหรือจัดคิวเต็ม ไม่ว่าในกรณีใดอินเทอร์เฟซนี้มีประโยชน์ในแง่ที่ง่ายกว่านั้นสมมติว่าก กำลังพยายามเพิ่มองค์ประกอบลงในคิวเต็มแล้ว ณ จุดนี้ในโปรแกรม BlockingQueue จะถูกเรียกใช้ซึ่งจะบล็อกเธรดนั้น ๆ จนกว่าเธรดอื่นจะปล่อยคิวเพื่อสร้างพื้นที่ ซึ่งอาจเป็นผลมาจากการยกเลิกการจัดคิวองค์ประกอบของการเคลียร์คิวทั้งหมด ในทำนองเดียวกัน BlockingQueue จะถูกเรียกใช้เพื่อบล็อกเธรดที่พยายามยกเลิกคิวที่ว่างอยู่แล้วจนกว่าเธรดอื่นจะแทรกหรือเพิ่มองค์ประกอบลงในช่องว่าง คิว .
ควรใช้เมื่อใด ใน java
ขณะทำงานกับอินเทอร์เฟซ BlockingQueue ใน Java คุณต้องจำไว้ว่ามันไม่ยอมรับค่า null ในกรณีที่คุณพยายามทำมันจะโยน NullPointerException ทันที รูปด้านล่างแสดงถึงการทำงานของอินเตอร์เฟส BlockingQueue ใน Java
นี้ อินเตอร์เฟซ ส่วนใหญ่จะใช้ระหว่าง 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 คลาส ได้แก่ :
- EduProducer
- EduConsumer
- 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' และเราจะติดต่อกลับโดยเร็วที่สุด