قوائم انتظار المهام في Java: نظرة عامة وتنفيذ مع java.util.concurrent

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

قوائم انتظار المهام في Java: دليل شامل لتعدد الخيوط والمعالجة غير المتزامنة



في تطوير Java الحديث، تعد الإدارة الفعالة للمهام في بيئة متعددة الخيوط حجر الزاوية للأداء. قوائم انتظار المهام (Task Queues) هي واحدة من أقوى وأكثر الأدوات مرونة لتنظيم المعالجة غير المتزامنة، وتوزيع الحمل، والتفاعل بين الخيوط. في هذه المقالة، سنشرح بالتفصيل كيفية عمل قوائم انتظار المهام في Java، وما هي التطبيقات التي توفرها المكتبة القياسية java.util.concurrent، وكيفية تطبيقها بشكل صحيح في الممارسة العملية.



ما هي قائمة انتظار المهام ولماذا نحتاجها؟



قائمة انتظار المهام هي بنية بيانات تعمل وفق مبدأ FIFO (أولاً يدخل، أولاً يخرج)، والتي تسمح لخيوط المنتجين بإضافة المهام، ولخيوط المستهلكين باستخراجها وتنفيذها. المزايا الرئيسية لاستخدام قوائم الانتظار:

  • فصل المسؤوليات: الكود الذي ينشئ المهام لا يعتمد على الكود الذي ينفذها.
  • توزيع الحمل: يتم توزيع المهام بالتساوي بين خيوط العمل.
  • التخزين المؤقت: يمكن لقائمة الانتظار تخزين المهام مؤقتًا إذا لم يتمكن المستهلكون من معالجتها.
  • إدارة الأحمال القصوى: لا ينهار النظام عند التدفق المفاجئ للطلبات.


التطبيقات الرئيسية لـ BlockingQueue



في Java، الواجهة المركزية لقوائم انتظار المهام هي BlockingQueue. وهي توسع قائمة الانتظار العادية بطرق تحظر الخيط حتى تصبح العملية ممكنة (على سبيل المثال، الانتظار حتى يتوفر مساحة). دعنا نلقي نظرة على التطبيقات الأكثر شيوعًا:



1. ArrayBlockingQueue

قائمة انتظار تعتمد على مصفوفة بسعة ثابتة. مناسبة تمامًا للسيناريوهات التي يكون فيها الحد الأقصى لعدد المهام معروفًا مسبقًا (على سبيل المثال، مجموعة اتصالات قاعدة البيانات).



import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;

public class ArrayBlockingQueueExample { public static void main(String[] args) throws InterruptedException { // إنشاء قائمة انتظار تتسع لـ 10 عناصر BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

// المنتج يضيف المهام queue.put("المهمة 1"); queue.put("المهمة 2");

// المستهلك يسحب المهام String task = queue.take(); // يتم الحظر إذا كانت قائمة الانتظار فارغة System.out.println("تمت المعالجة: " + task); }}


2. LinkedBlockingQueue

قائمة انتظار تعتمد على قائمة مرتبطة. يمكن أن تكون محدودة (إذا تم تحديد السعة) أو غير محدودة عمليًا. مثالية لتنفيذ نمط "المنتج-المستهلك" مع حمل غير متوقع.



import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueExample { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(100);

// خيط المنتج new Thread(() -> { for (int i = 0; i < 50; i++) { try { queue.put(i); System.out.println("تمت الإضافة: " + i); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start();

// خيط المستهلك new Thread(() -> { while (true) { try { Integer value = queue.take(); System.out.println("تم الاستخراج: " + value); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } }).start(); }}


3. PriorityBlockingQueue

غير محدودة

توصيات