หากการปิดกั้นเต็มรูปแบบการดำเนินการใด ๆ ที่พยายามจัดเก็บสิ่งต่าง ๆ จะถูกบล็อกและจะไม่ถูกปลุกให้ดำเนินการต่อไปจนกว่าจะมีพื้นที่ใหม่ในการปิดกั้น
วิธีการหลักที่จัดทำโดย BlockingQueue คือ:
เพิ่ม (anobject): เพิ่ม anobject ไปยัง blockingqueue
ข้อเสนอ (anobject): เพิ่ม anobject ไปยัง blockingqueue
ใส่ (anobject): เพิ่ม anobject ไปยัง blockingqueue
โพล (เวลา): นำวัตถุออกมาอันดับแรกในการปิดกั้น ส่งคืนโมฆะเมื่อไม่สามารถเรียกคืนได้
Take (): นำวัตถุออกมาอันดับแรกใน BlockingQueue
มี 4 การใช้งานเฉพาะของ BlockingQueue ตามความต้องการที่แตกต่างกัน:
(1) ArrayblockingQueue: ตัวสร้างขนาดที่ระบุจะต้องมีพารามิเตอร์ int เพื่อระบุขนาดของมัน วัตถุที่มีอยู่จะถูกจัดเรียงตามลำดับ FIFO (ครั้งแรก, แรกออก)
(2) LinkedBlockingQueue: BlockingQueue ที่มีขนาดแตกต่างกัน
หากไม่รวมพารามิเตอร์ขนาดขนาดของการปิดกั้นที่สร้างขึ้นจะถูกกำหนดโดยจำนวนเต็ม max_value วัตถุที่มีอยู่จะถูกจัดเรียงตามลำดับ FIFO (ครั้งแรก, แรกออก)
เมื่อเทียบกับ LinkedBlockingQueue และ ArrayBlockingQueue โครงสร้างข้อมูลที่ใช้อยู่เบื้องหลังนั้นแตกต่างกัน
ปริมาณข้อมูลของ LinkedBlockingQueue มากกว่าของ ArrayBlockingQueue แต่การคาดการณ์ประสิทธิภาพของมันต่ำกว่าของ ArrayBlockingQueue เมื่อจำนวนเธรดมีขนาดใหญ่
(3) PriorityBlockingQueue: คล้ายกับ LinkedBlockingQueue แต่การเรียงลำดับของวัตถุที่มีอยู่ไม่ใช่ FIFO แต่ถูกกำหนดโดยลำดับการเรียงลำดับตามธรรมชาติของวัตถุหรือคำสั่งที่กำหนดโดยตัวเปรียบเทียบที่นำโดยตัวสร้าง
(4) Synchronousqueue: การปิดกั้นพิเศษการดำเนินการของมันจะต้องเสร็จสิ้นสลับกันโดยการวางและดึงข้อมูล
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.yo;
นำเข้า java.util.concurrent.arrayblockingqueue;
นำเข้า java.util.concurrent.blockingqueue;
นำเข้า java.util.concurrent.executorservice;
นำเข้า java.util.concurrent.executors;
การปิดกั้นชั้นเรียนสาธารณะ {
-
กำหนดตะกร้าสำหรับแอปเปิ้ล
-
ตะกร้าชั้นเรียนคงที่สาธารณะ {
// ตะกร้าสามารถถือ 3 แอปเปิ้ล
BlockingQueue <String> BACATEL = New ArrayBlockingQueue <String> (3);
// ผลิตแอปเปิ้ลและใส่ไว้ในตะกร้า
โมฆะสาธารณะผลิต () พ่น InterruptedException {
// ใส่แอปเปิ้ลในวิธีการใส่
basket.put ("an Apple");
-
// กินแอปเปิ้ลและนำออกจากตะกร้า
การบริโภคสตริงสาธารณะ () พ่น InterruptedException {
// Get Method จะใช้แอปเปิ้ล
string apple = basket.take ();
คืนแอปเปิ้ล;
-
public int getapplenumber () {
กลับมาตะกร้า ();
-
-
// วิธีทดสอบ
Public Static Void TestBasket () {
// สร้างตะกร้ากับแอปเปิ้ล
ตะกร้าตะกร้าสุดท้าย = ตะกร้าใหม่ ();
// กำหนดผู้ผลิต Apple
ผู้ผลิตในชั้นเรียนใช้งาน Runnable {
โมฆะสาธารณะเรียกใช้ () {
พยายาม {
ในขณะที่ (จริง) {
// ผลิตแอปเปิ้ล
System.out.println ("ผู้ผลิตพร้อมที่จะผลิตแอปเปิ้ล:"
+ System.currentTimeMillis ());
Basket.produce ();
System.out.println ("ผู้ผลิตได้ผลิตแอปเปิ้ลเสร็จแล้ว:"
+ System.currentTimeMillis ());
System.out.println ("หลังการผลิตมีแอปเปิ้ล:"+basket.get.pplenumber ()+");
// 300ms นอนหลับ
Thread.sleep (300);
-
} catch (interruptedException ex) {
-
-
-
// กำหนดผู้บริโภคแอปเปิ้ล
ผู้บริโภคในชั้นเรียนใช้งานได้ {
โมฆะสาธารณะเรียกใช้ () {
พยายาม {
ในขณะที่ (จริง) {
// การบริโภคแอปเปิ้ล
System.out.println ("ผู้บริโภคพร้อมที่จะบริโภค Apple:"
+ System.currentTimeMillis ());
basket.consume ();
System.out.println ("ผู้บริโภคใช้ Apple"
+ System.currentTimeMillis ());
System.out.println ("หลังการบริโภคมีแอปเปิ้ล:"+basket.get.pplenumber ()+");
// 1,000ms นอนหลับ
Thread.sleep (1,000);
-
} catch (interruptedException ex) {
-
-
-
ExecutorService Service = Executors.NewCachedThreadPool ();
โปรดิวเซอร์ผู้ผลิต = ผู้ผลิตใหม่ ();
ผู้บริโภคผู้บริโภค = ผู้บริโภคใหม่ ();
Service.submit (ผู้ผลิต);
Service.submit (ผู้บริโภค);
// หลังจากโปรแกรมทำงานเป็นเวลา 10 วินาทีงานทั้งหมดจะหยุดลง
พยายาม {
Thread.sleep (10,000);
} catch (interruptedException e) {
-
Service.shutdownnow ();
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
BlockingQueuetest.TestBasket ();
-
-