English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليميات Java الأساسية

Java التحكم في العملية

Java مجموعة من الأعداد

Java توجيهية الأوبئة (I)

Java توجيهية الأوبئة (II)

Java توجيهية الأوبئة (III)

معالجة الاستثناءات Java

Java قائمة List

Java مجموعة Queue (الصف)

Java مجموعة Map

Java مجموعة Set

Java إدخال/إخراج (I/O)

Java Reader/Writer

Java مواضيع أخرى

Java LinkedBlockingQueue

في هذا الدليل، سنستخدم الأمثلة لدراسة فئة LinkedBLockingQueue وطرقها.

استخدام فئة LinkedBlockingQueue من إطار العمل Java Collections لتوفير تنفيذ قائمة انتظار مكتظة باستخدام قائمة مرتبطة.

لقد تم إنجازهJava BlockingQueue واجهة.

إنشاء LinkedBlockingQueue

لإنشاء قائمة الحظر السلسة، يجب علينا إدراج حزمة java.util.concurrent.LinkedBlockingQueue.

هذه هي الطريقة التي نقوم بها بإنشاء قائمة الحظر السلسة في Java:

1. بدون حجم مبدئي

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

في هذا السياق، الحجم المبدئي الافتراضي هو 2 31 -1.

2. مع الحجم المبدئي

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);

في هذا السياق،

  • Type - نوع قائمة الحظر السلسة

  • capacity - حجم قائمة الحظر السلسة

على سبيل المثال،

// إنشاء LinkedBlockingQueue حجمه 5 من النوع String
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// إنشاء LinkedBlockingQueue حجمه 5 من النوع Integer
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>(5);

ملاحظة:ليس من الضروري تقديم حجم القائمة.

طرق LinkedBlockingQueue

يقدمها فئة LinkedBlockingQueueواجهة BlockingQueueكل تنفيذ للاجراءات.

تستخدم هذه الطرق للاضطراب، الوصول، والإزالة من قائمة الحظر السلسة.

إضافة إلى ذلك، سنتعلم عن طريقتين put()، take()، تدعم عمليات الحظر في قائمة الحظر السلسة.

تفرق هذان الطريقيان بين قائمة الحظر السلسة وغيرها من القوائم التقليدية.

إدراج العناصر

  • add() - يضيف العنصر المحدد إلى قائمة الحظر السلسة. إذا كانت القائمة ممتلئة، فإنها ترمي استثناءً.

  • offer() - يضيف العنصر المحدد إلى قائمة الحظر السلسة. إذا كانت القائمة ممتلئة، فإنها تعود false.

على سبيل المثال،

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        // استخدم add()
        animals.add("Dog");
        animals.add("Cat");
        // استخدم offer()
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
    }
}

النتيجة المتوقعة

LinkedBlockingQueue: [Dog, Cat, Horse]

زيارة العناصر

  • peek() - يعيد عنصرًا من مقدمة قائمة الحظر السلسة. إذا كانت القائمة فارغة، فإنها تعود null.

  • iterator() - يعود بجسم م迭代ر لاستطلاع العناصر في قائمة الحظر السلسة. إذا كانت القائمة فارغة، فإنها ترمي استثناءً. يجب علينا إدراج حزمة java.util.Iterator لاستخدامها.

على سبيل المثال،

import java.util.concurrent.LinkedBlockingQueue;
إدراج import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        // إضافة عنصر
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        // استخدم peek()
        String element = animals.peek();
        System.out.println("استنساخ العنصر: " + element);
        // استخدام iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("عناصر LinkedBlockingQueue: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

النتيجة المتوقعة

LinkedBlockingQueue: [Dog, Cat, Horse]
استنساخ العنصر: Dog
عناصر LinkedBlockingQueue: Dog, Cat, Horse,

حذف العنصر

  • remove() - عودة العنصر المحدد من سلسلة الحظر وإزالته. إذا كان الصندوق فارغًا، فإنه سيتم إلقاء استثناء.

  • poll() - عودة العنصر المحدد من سلسلة الحظر وإزالته. إذا كان الصندوق فارغًا، فسيتم عودة null.

  • clear() - حذف جميع العناصر من سلسلة الحظر.

على سبيل المثال،

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue " + animals);
        // استخدام remove()
        String element1 = animals.remove();
        System.out.println("حذف العنصر:");
        System.out.println("استخدام remove(): " + element1);
        // استخدام poll()
        String element2 = animals.poll();
        System.out.println("استخدام poll(): " + element2);
        // استخدام clear()
        animals.clear();
        System.out.println("LinkedBlockingQueue بعد التحديث " + animals);
    }
}

النتيجة المتوقعة

LinkedBlockingQueue: [Dog, Cat, Horse]
حذف العنصر:
استخدام remove(): Dog
استخدام poll(): Cat
LinkedBlockingQueue: []

طريقتي put() وtake()

في عملية متعددة النواة، يمكننا استخدام put() وtake() لتحديد عمل سلسلة النواة لتحقيق التوافق مع سلسلة أخرى. ستبقى هذه الطرق في انتظار تنفيذها بنجاح.

طريقة put()

لإضافة العنصر المحدد إلى نهاية قائمة الحظر المرتبة، نستخدم الطريقة put().

إذا كانت قائمة الحظر المرتبة ممتلئة، فإنها ستنتظر حتى يكون هناك مساحة كافية للاضطلاع بالعنصر.

على سبيل المثال،

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
          //إضافة العنصر إلى animals
           animals.put("كلب");
           animals.put("قط");
           System.out.println("LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

النتيجة المتوقعة

LinkedBlockingQueue: [قط، قط]

في هذه الحالة، إذا تم إيقافها أثناء الانتظار، قد تقوم الطريقة put() بعرض استثناء InterruptedException. لذلك، يجب علينا تضمينها فيفي محاكاة try..catch.

طريقة take()

لإزالة عنصر من مقدمة قائمة الحظر المرتبة وإزالته، يمكننا استخدام الطريقة take().

إذا كانت قائمة الحظر مرتبة فارغة، فإنها ستنتظر حتى يكون هناك عنصر لإزالته من قائمة الحظر المرتبة.

على سبيل المثال،

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
           //إضافة العنصر إلى animals
           animals.put("كلب");
           animals.put("قط");
           System.out.println("LinkedBlockingQueue: " + animals);
           //حذف عنصر
           String element = animals.take();
           System.out.println("حذف العنصر: " + element);
           System.out.println("القائمة المرتبة الجديدة: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

النتيجة المتوقعة

LinkedBlockingQueue: [قط، قط]
حذف العنصر: [قط]
القائمة المرتبة الجديدة: [قط]

في هذه الحالة، إذا تم إيقافها أثناء الانتظار، ستقوم الطريقة take() بعرض استثناء InterruptedException. لذلك، يجب علينا تضمينها في محاكاة try...catch.

Other Methods

MethodsContent Description
contains(element)Search for the specified element in the linked list blocking queue. If the element is found, return true, otherwise return false.
size()Return the length of the linked list blocking queue.
toArray()Convert the linked list blocking queue to an array and return the array.
toString()Convert the linked list blocking queue to a string

Why use LinkedBlockingQueue?

LinkedBlockingQueue uses a linked list as its internal storage.

It is consideredThread-safeCollection. Therefore, it is usually used in multithreaded applications.

Assuming one thread is inserting elements into the queue, while another thread is deleting elements from the queue.

Now, if the first thread is slower than the second thread, the linked list blocking queue can make the second thread wait until the first thread completes its operation.