परिचय: जावा में कार्य कतारों की आवश्यकता क्यों है?
\n\nप्रत्येक डेवलपर को देर-सबेर डेटा की स्ट्रीम प्रोसेसिंग को व्यवस्थित करने की आवश्यकता का सामना करना पड़ता है। एक वेब सर्वर की कल्पना करें जो प्रति सेकंड हजारों अनुरोध स्वीकार करता है, या एक सिस्टम जो ऑनलाइन स्टोर के ऑर्डर प्रोसेस करता है। सब कुछ एक साथ प्रोसेस करना असंभव है — संसाधन सीमित हैं। यहाँ पर कार्य कतारें (task queues) मददगार साबित होती हैं।
\n\nजावा में कार्य कतार केवल FIFO (First In, First Out) डेटा संरचना नहीं है। यह इसके लिए एक शक्तिशाली उपकरण है:
\n- \n
- कार्यों के उत्पादन और उपभोग को अलग करना (Producer-Consumer पैटर्न) \n
- लोड प्रबंधन — जब सिस्टम व्यस्त होता है तो कार्य कतार में जमा हो जाते हैं \n
- अतुल्यकालिक प्रसंस्करण — उत्पादक थ्रेड कार्य के पूरा होने की प्रतीक्षा नहीं करता \n
- थ्रेड्स के बीच संतुलन — कई वर्कर सामान्य कतार से कार्य लेते हैं \n
इस लेख में, हम जावा में कतारों के साथ काम करने के सभी बुनियादी पहलुओं को कवर करेंगे: बुनियादी Collection Framework इंटरफ़ेस से लेकर मल्टीथ्रेडेड अनुप्रयोगों के लिए थ्रेड-सुरक्षित कतारों तक।
\n\nबुनियादी कतारें: Queue और Deque
\n\nQueue इंटरफ़ेस
\n\nइंटरफ़ेस java.util.Queue जावा में सभी कतारों का आधार है। यह कतार के साथ काम करने के लिए मानक संचालन प्रदान करता है:
| संचालन | त्रुटि पर अपवाद | विशेष मान वापसी |
|---|---|---|
| जोड़ना | add(e) | offer(e) |
| निकालना और हटाना | remove() | poll() |
| देखना (बिना हटाए) | element() | peek() |
विधियों के बीच अंतर स्पष्ट है: यदि कतार खाली है, तो remove() और element() NoSuchElementException फेंकेंगे, जबकि poll() और peek() null लौटाएंगे।
सबसे लोकप्रिय Queue कार्यान्वयन:
\n- \n
- LinkedList — डबल-लिंक्ड लिस्ट, सामान्य FIFO कतार के रूप में काम करती है \n
- PriorityQueue — प्राथमिकता कतार, तत्व Comparator द्वारा निर्धारित क्रम में निकाले जाते हैं \n
- ArrayDeque — ऐरे-आधारित दो-तरफा कतार \n
उदाहरण: LinkedList पर सरल कार्य कतार
\n\nimport java.util.LinkedList;\nimport java.util.Queue;\n\npublic class SimpleTaskQueue {\n public static void main(String[] args) {\n Queue<String> taskQueue = new LinkedList<>();\n\n // कार्य जोड़ें\n taskQueue.offer("डेटाबेस से डेटा लोड करें");\n taskQueue.offer("ईमेल सूचना भेजें");\n taskQueue.offer("रिपोर्ट जनरेट करें");\n\n System.out.println("कतार: " + taskQueue);\n\n // सभी कार्यों को प्रोसेस करें\n while (!taskQueue.isEmpty()) {\n String task = taskQueue.poll();\n System.out.println("निष्पादित कर रहा हूँ: " + task);\n }\n\n System.out.println("सभी कार्य पूर्ण!");\n }\n}\n\nDeque इंटरफ़ेस
\n\nDeque (Double Ended Queue) दोनों सिरों से तत्वों को जोड़ने और निकालने की अनुमति देता है। यह लचीलापन प्रदान करता है: कतार स्टैक (LIFO) या सामान्य कतार (FIFO) के रूप में काम कर सकती है।
Deque के मुख्य तरीके:
\n- \n
addFirst()/offerFirst()— शुरुआत में जोड़ें \n addLast()/offerLast()— अंत में जोड़ें \n removeFirst()/pollFirst()— शुरुआत से निकालें \n removeLast()/pollLast()— अंत से निकालें \n
उदाहरण: विलंबित कार्यों के लिए स्टैक के रूप में Deque
\n\nimport java.util.ArrayDeque;\nimport java.util.Deque;\n\npublic class DequeExample {\n public static void main(String[] args) {\n De