قوائم المهام في Java: من الأساسيات إلى الحلول متعددة الخيوط
قائمة المهام (Task Queue) هي أحد الأنماط الأساسية في تطوير البرمجيات. في Java، يتم تنفيذ هذه الآلية من خلال الواجهة Queue وتطبيقاتها المتعددة. تتيح قائمة المهام تنظيم معالجة المهام حسب ترتيب وصولها (FIFO — First In, First Out)، وهو أمر مهم بشكل خاص عند العمل مع مجموعات الخيوط (Thread Pools)، والعمليات غير المتزامنة، والأنظمة الموزعة.
في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع قوائم المهام في Java: من الواجهة الأساسية إلى التطبيقات المتقدمة متعددة الخيوط. ستتعرف على الفئات التي يجب استخدامها في السيناريوهات المختلفة وكيفية تجنب الأخطاء الشائعة.
1. الواجهة Queue والعمليات الأساسية
الواجهة Queue هي جزء من Java Collections Framework. وهي تحدد الطرق الأساسية للعمل مع قائمة المهام:
add(E e)— يضيف عنصرًا، ويطرح استثناءً عند الامتلاء؛offer(E e) — يضيف عنصرًا، ويعيد remove()— يزيل ويعيد العنصر الرئيسي (head)، ويطرح استثناءً إذا كانت القائمة فارغة؛poll()— يزيل ويعيد العنصر الرئيسي، ويعيدnullإذا كانت القائمة فارغة؛element()— يعيد العنصر الرئيسي دون إزالته، ويطرح استثناءً إذا كانت القائمة فارغة؛peek()— يعيد العنصر الرئيسي دون إزالته، ويعيدnullإذا كانت القائمة فارغة.
false عند الفشل؛ مثال على العمل الأساسي مع قائمة المهام:
import java.util.LinkedList;import java.util.Queue;
public class SimpleQueueExample { public static void main(String[] args) { Queue<String> taskQueue = new LinkedList<>();
// إضافة المهام taskQueue.offer("Task 1: Process order"); taskQueue.offer("Task 2: Send email"); taskQueue.offer("Task 3: Generate report");
System.out.println("Current task: " + taskQueue.peek()); System.out.println("Queue size: " + taskQueue.size());
// معالجة جميع المهام while (!taskQueue.isEmpty()) { String task = taskQueue.poll(); System.out.println("Executing: " + task); } }}نتيجة التنفيذ:
Current task: Task 1: Process orderQueue size: 3Executing: Task 1: Process orderExecuting: Task 2: Send emailExecuting: Task 3: Generate report2. التطبيقات الرئيسية لقوائم المهام
تقدم Java عدة تطبيقات للواجهة Queue، كل منها مناسب لسيناريوهات محددة.
2.1. LinkedList كقائمة مهام
LinkedList هو أحد أبسط التطبيقات وأكثرها عمومية. يعمل كقائمة مرتبطة ثنائية الاتجاه (doubly linked list)، مما يسمح بإضافة وإزالة العناصر بسرعة من كلا الطرفين. ومع ذلك، بالنسبة للكميات الكبيرة من البيانات، قد ينخفض الأداء بسبب التكاليف الإضافية لتخزين المراجع.
Queue<Integer> linkedQueue = new LinkedList<>();linkedQueue.add(10);linkedQueue.add(20);linkedQueue.add(30);System.out.println(linkedQueue.poll()); // 102.2. PriorityQueue — قائمة مهام ذات أولويات
PriorityQueue لا تلتزم بترتيب FIFO الصارم. يتم استخراج العناصر حسب ترتيب أولويتها، والذي يتم تحديده إما بالترتيب الطبيعي (Comparable) أو بواسطة مقارن (Comparator). هذا هو الخيار المثالي للأنظمة التي تكون فيها بعض المهام أكثر أهمية من غيرها.
import java.util.PriorityQueue;import java.util.Queue;
public class PriorityQueueExample { public static void main(String[] args) { Queue<Task> priorityQueue = new PriorityQueue<>( (t1, t2) -> Integer.compare(t1.priority, t2.priority) );```