اليوم سنتعرف على Java BlockingQueue. java.util.concurrent.BlockingQueue
هو اصطفاف جافا يدعم العمليات التي تنتظر حتى يصبح الاصطفاف غير فارغ عند استرجاع العنصر وإزالته، وتنتظر حتى تصبح هناك مساحة متاحة في الاصطفاف عند إضافة عنصر.
Java BlockingQueue
لا يقبل Java BlockingQueue قيم
null
ويقوم بإلقاء NullPointerException
إذا حاولت تخزين قيمة null في الاصطفاف. تكون تنفيذات Java BlockingQueue آمنة للمواضيع. جميع طرق الاصطفاف هي ذات طابع ذري وتستخدم قفلًا داخليًا أو أشكالًا أخرى من التحكم في التناوب. واجهة Java BlockingQueue هي جزء من إطار جافا للمجموعات وتستخدم أساسًا لتنفيذ مشكلة المنتج والمستهلك. لا داعي للقلق بشأن انتظار المساحة المتاحة للمنتج أو توفر الكائن للمستهلك في BlockingQueue لأنه يتم التعامل معه من قبل فئات التنفيذ لـ BlockingQueue. توفر جافا عدة تنفيذات لـ BlockingQueue مثل ArrayBlockingQueue
، LinkedBlockingQueue
، PriorityBlockingQueue
، SynchronousQueue
وما إلى ذلك. عند تنفيذ مشكلة المنتج والمستهلك في BlockingQueue، سنستخدم تنفيذ ArrayBlockingQueue. فيما يلي بعض الطرق الهامة التي يجب عليك معرفتها.
put(E e)
: تستخدم هذه الطريقة لإدراج العناصر في الطابور. إذا كان الطابور ممتلئًا، فإنه ينتظر توافر المساحة.E take()
: This method retrieves and remove the element from the head of the queue. If queue is empty it waits for the element to be available.
لنقم بتنفيذ مشكلة المنتج والمستهلك باستخدام java BlockingQueue الآن.
مثال على Java BlockingQueue – الرسالة
كائن Java عادي سيتم إنتاجه بواسطة المنتج وإضافته إلى الطابور. يمكنك أيضًا استدعاؤه كحمولة أو رسالة طابور.
package com.journaldev.concurrency;
public class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
}
مثال على Java BlockingQueue – المنتج
فئة المنتج التي ستنشئ الرسائل وتضعها في الطابور.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue queue;
public Producer(BlockingQueue q){
this.queue=q;
}
@Override
public void run() {
// إنتاج الرسائل
for(int i=0; i<100; i++){
Message msg = new Message(""+i);
try {
Thread.sleep(i);
queue.put(msg);
System.out.println("Produced "+msg.getMsg());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// إضافة رسالة الخروج
Message msg = new Message("exit");
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
مثال على Java BlockingQueue – المستهلك
فئة المستهلك التي ستقوم بمعالجة الرسائل من الطابور وتنهي عند تلقي رسالة الخروج.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable{
private BlockingQueue queue;
public Consumer(BlockingQueue q){
this.queue=q;
}
@Override
public void run() {
try{
Message msg;
// استهلاك الرسائل حتى تلقي رسالة الخروج
while((msg = queue.take()).getMsg() !="exit"){
Thread.sleep(10);
System.out.println("Consumed "+msg.getMsg());
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
مثال على Java BlockingQueue – الخدمة
أخيرًا يجب علينا إنشاء خدمة BlockingQueue للمنتج والمستهلك. ستقوم هذه الخدمة المنتج والمستهلك بإنشاء BlockingQueue بحجم ثابت ومشاركتها مع المنتجين والمستهلكين على حد سواء. ستقوم هذه الخدمة ببدء مواضيع المنتج والمستهلك والخروج.
package com.journaldev.concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ProducerConsumerService {
public static void main(String[] args) {
// إنشاء BlockingQueue بحجم 10
BlockingQueue queue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
// بدء المنتج في إنتاج الرسائل في طابور الانتظار
new Thread(producer).start();
// بدء المستهلك في استهلاك الرسائل من طابور الانتظار
new Thread(consumer).start();
System.out.println("Producer and Consumer has been started");
}
}
يتم عرض الناتج لبرنامج مثال Java BlockingQueue أعلاه أدناه.
Producer and Consumer has been started
Produced 0
Produced 1
Produced 2
Produced 3
Produced 4
Consumed 0
Produced 5
Consumed 1
Produced 6
Produced 7
Consumed 2
Produced 8
...
تم استخدام النوم في الخيط الجاف للمنتج والمستهلك لإنتاج واستهلاك الرسائل مع بعض التأخير.
Source:
https://www.digitalocean.com/community/tutorials/java-blockingqueue-example