CodeGym /جاوا بلاگ /Random-UR /جاوا قطار انٹرفیس اور اس کے نفاذ
John Squirrels
سطح
San Francisco

جاوا قطار انٹرفیس اور اس کے نفاذ

گروپ میں شائع ہوا۔
یہاں ہم جاوا کیو انٹرفیس پر بات کرنے جا رہے ہیں۔ آپ جان لیں گے کہ قطار ڈیٹا کا ڈھانچہ کیا ہے، جاوا میں اس کی نمائندگی کیسے کی جاتی ہے، تمام قطاروں کے لیے کون سے طریقے سب سے اہم ہیں۔ نیز، جاوا زبان میں قطار کے کیا نفاذ ہیں۔ اس کے بعد، ہم سب سے اہم نفاذ کو قریب سے دیکھتے ہیں اور انہیں مثالوں کے ساتھ سیکھتے ہیں۔

قطار ڈیٹا کا ڈھانچہ

قطار ایک لکیری تجریدی ڈیٹا کا ڈھانچہ ہے جس میں آپریشنز کو انجام دینے کے مخصوص ترتیب ہیں — فرسٹ ان فرسٹ آؤٹ (FIFO)۔ اس کا مطلب ہے کہ آپ صرف ڈھانچے کے آخر میں ایک عنصر (یا قطار میں ڈالیں) شامل کر سکتے ہیں، اور صرف اس کے آغاز سے ایک عنصر لے سکتے ہیں (قطار سے ہٹا دیں یا قطار سے ہٹا دیں)۔ آپ قطار ڈیٹا کی ساخت کا بہت آسانی سے تصور کر سکتے ہیں۔ یہ حقیقی زندگی میں ایک قطار یا گاہکوں کی ایک لائن کی طرح لگتا ہے۔ جو گاہک پہلے آیا، اسے بھی پہلے پیش کیا جائے گا۔ اگر آپ کے پاس میکڈونلڈز یا کسی اور جگہ لائن میں چار لوگ ہیں، تو سب سے پہلے لائن لگانے والا اسٹور حاصل کرنے والا پہلا ہوگا۔ اگر نیا گاہک آتا ہے، تو وہ ہیمبرگر حاصل کرنے کے لیے قطار میں 5ویں نمبر پر ہوگا۔ جاوا قطار انٹرفیس اور اس کے نفاذ - 1لہذا، قطار کے ساتھ کام کرتے ہوئے، آخر میں نئے عناصر شامل کیے جاتے ہیں، اور اگر آپ عنصر حاصل کرنا چاہتے ہیں، تو اسے شروع سے لیا جائے گا۔ یہ کلاسیکی قطار ڈیٹا ڈھانچے کے کام کا بنیادی اصول ہے۔

جاوا میں قطار

جاوا میں قطار ایک انٹرفیس ہے۔ اوریکل دستاویزات کے مطابق، قطار انٹرفیس میں 2 سپر انٹرفیس، 4 مختلف انٹرفیس ہیں جو قطار سے وراثت میں آتے ہیں، اور کلاسوں کی ایک انتہائی متاثر کن فہرست ہے۔

سپر انٹرفیس:

مجموعہ<E>، قابل تکرار<E>

تمام معروف ذیلی انٹرفیس:

BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E>

تمام معروف نافذ کرنے والے کلاسز:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PrioryronchQueue

اس کا کیا مطلب ہے؟ سب سے پہلے، Java Queue کلیکشن فریم ورک کا ایک حصہ ہے اور کلیکشن انٹرفیس کو لاگو کرتا ہے۔ لہذا یہ کلیکشن انٹرفیس کے تمام طریقوں کی حمایت کرتا ہے جیسے اندراج، حذف کرنا وغیرہ۔ قطار دوبارہ قابل انٹرفیس کو نافذ کرتی ہے، جو کسی شے کو "ہر لوپ کے لیے" بیان کا ہدف بننے کی اجازت دیتا ہے۔

قطار کے طریقے جاوا

قطار کئی طریقوں کا اعلان کرتی ہے۔ انٹرفیس کے طریقوں کے طور پر ان کی نمائندگی تمام کلاسوں میں کی جانی چاہئے جو قطار کو لاگو کرتے ہیں۔ سب سے اہم قطار کے طریقے، جاوا:
  • بولین پیشکش () - اگر ممکن ہو تو قطار میں ایک نیا عنصر داخل کرتا ہے۔
  • بولین ایڈ (ای ای) - اگر ممکن ہو تو قطار میں ایک نیا عنصر داخل کرتا ہے۔ کامیابی کی صورت میں درست لوٹتا ہے اور جگہ نہ ہونے کی صورت میں IllegalStateException پھینک دیتا ہے۔
  • آبجیکٹ پول () - ایک عنصر کو حاصل کرتا ہے اور اس کے سر سے ہٹاتا ہے۔ اگر قطار خالی ہو تو null لوٹاتا ہے۔
  • آبجیکٹ ہٹانا () - قطار کے سر سے ایک عنصر کو بازیافت اور ہٹاتا ہے۔
  • آبجیکٹ پیک () - بازیافت کرتا ہے، لیکن قطار کے سر سے کسی عنصر کو نہیں ہٹاتا ہے۔ اگر قطار خالی ہو تو null لوٹاتا ہے۔
  • آبجیکٹ عنصر () - بازیافت کرتا ہے، لیکن قطار کے سر سے کسی عنصر کو نہیں ہٹاتا ہے۔

جاوا قطار کے ذیلی انٹرفیس

قطار انٹرفیس کو 4 ذیلی انٹرفیس سے وراثت میں ملا ہے – BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E> ۔ آپ ان کو 3 گروپوں میں تقسیم کر سکتے ہیں: ڈیک، بلاکنگ کیویز اور ٹرانسفر قطار جس میں بلاکنگ ڈیک پہلے دونوں سے تعلق رکھتے ہیں۔ آئیے ان گروپس پر ایک نظر ڈالتے ہیں۔

ڈیکس

Deque کا مطلب ہے D ouble- Ended Q ueue اور ڈیٹا کے کسی بھی دم سے بطور قطار (first-in-first-out/FIFO) یا سر سے ایک اور مقبول ڈیٹا سٹرکچر کے طور پر شامل کرنے یا ہٹانے کی حمایت کرتا ہے جسے اسٹیک ( آخری میں- فرسٹ آؤٹ/LIFO)۔ کلاسز جو ڈیک انٹرفیس کو نافذ کرتی ہیں: ArrayDeque، ConcurrentLinkedDeque، LinkedBlockingDeque، LinkedList۔

قطاروں کو مسدود کرنا

ایک بلاک کرنے والی قطار ایک قطار ہے جو دو صورتوں میں ایک دھاگے کو روکتی ہے:
  • تھریڈ ایک خالی قطار سے عناصر حاصل کرنے کی کوشش کر رہا ہے۔
  • تھریڈ عناصر کو پوری قطار میں ڈالنے کی کوشش کر رہا ہے۔
جب کوئی تھریڈ خالی قطار سے آئٹمز حاصل کرنے کی کوشش کرتا ہے، تو وہ اس وقت تک انتظار کرتا ہے جب تک کہ کوئی دوسرا دھاگہ آئٹمز کو قطار میں نہ ڈال دے۔ اسی طرح، جب ایک تھریڈ عناصر کو مکمل قطار میں ڈالنے کی کوشش کرتا ہے، تو یہ اس وقت تک انتظار کرتا ہے جب تک کہ کوئی دوسرا تھریڈ عناصر کو قطار سے باہر نہ لے جائے تاکہ عناصر کے لیے خالی جگہ حاصل کی جا سکے۔ یقینی طور پر، "مکمل قطار" کے تصور کا مطلب یہ ہے کہ قطار کا سائز محدود ہے، جو عام طور پر کنسٹرکٹر میں بیان کیا جاتا ہے۔ معیاری بلاکنگ قطاروں میں LinkedBlockingQueue، SynchronousQueue، اور ArrayBlockingQueue شامل ہیں۔ BlockingQueue انٹرفیس کی کلاسز کا نفاذ : ArrayBlockingQueue، DelayQueue، LinkedBlockingDeque، LinkedBlockingQueue، LinkedTransferQueue، PriorityBlockingQueue، SynchronousQueue۔ BlockingDeque BlockingQueue کے لیے ایک ذیلی انٹرفیس ہے۔ BlockingDeque جیسے BlockingQueue ایک بلاک کرنے والی قطار ہے، لیکن دو طرفہ ہے۔ لہذا یہ ڈیک انٹرفیس کی خصوصیات کو وراثت میں ملا ہے۔ یہ ملٹی تھریڈڈ ایگزیکیوشن پر مبنی ہے، صفر عناصر کی اجازت نہیں دیتا اور صلاحیت محدود ہو سکتی ہے۔ BlockingDeque انٹرفیس کے نفاذ سے اگر قطار خالی ہو تو عناصر حاصل کرنے کے عمل کو روکتا ہے، اور اگر یہ بھرا ہوا ہو تو قطار میں ایک عنصر شامل کرنا۔

قطاریں منتقل کریں۔

TransferQueue انٹرفیس BlockingQueue انٹرفیس کو بڑھاتا ہے۔ تاہم BlockingQueue انٹرفیس قطاروں کے نفاذ کے برعکس، جہاں دھاگوں کو بلاک کیا جا سکتا ہے اگر قطار خالی ہے (پڑھنا)، یا اگر قطار بھری ہوئی ہے (لکھنا)، TransferQueue انٹرفیس کی قطاریں تحریری سلسلے کو روکتی ہیں جب تک کہ کوئی دوسرا سلسلہ عنصر کو بازیافت نہ کر لے۔ اس کے لیے منتقلی کا طریقہ استعمال کریں۔ دوسرے لفظوں میں، BlockingQueue کا نفاذ اس بات کی ضمانت دیتا ہے کہ پروڈیوسر کی طرف سے تخلیق کردہ عنصر کو قطار میں ہونا چاہیے، جب کہ TransferQueue کا نفاذ اس بات کی ضمانت دیتا ہے کہ پروڈیوسر کا عنصر صارف کو "وصول" کرتا ہے۔ TransferQueue انٹرفیس - LinkedTransferQueue کا صرف ایک باضابطہ جاوا نفاذ ہے۔

جاوا قطار کے نفاذ

بہت ساری کلاسیں ہیں جو قطار انٹرفیس کو نافذ کرتی ہیں:
  • AbstractQueue Queue Java 8 docs کے مطابق، یہ خلاصہ کلاس کچھ Queue آپریشنز کے بنیادی نفاذ فراہم کرتی ہے۔ یہ کالعدم عناصر کی اجازت نہیں دیتا ہے۔ قطار کلاسیکی پیشکش ، پول ، اور جھانکنے کی بنیاد پر بالترتیب 3 مزید طریقے شامل، ہٹانے، اور عنصر ہیں ۔ تاہم وہ غلط یا کالعدم ریٹرن کے ذریعے ناکامی کی نشاندہی کرنے کے بجائے مستثنیات پھینک دیتے ہیں۔
  • ArrayBlockingQueue — ایک مقررہ سائز FIFO بلاک کرنے والی قطار جس کی حمایت ایک صف کے ذریعے کی گئی ہے۔
  • ArrayDeque - ڈیک انٹرفیس کا دوبارہ سائز کے قابل سرنی کا نفاذ
  • ConcurrentLinkedDeque — لنکڈ نوڈس پر مبنی ایک غیر باؤنڈ کنکرنٹ ڈیک۔
  • ConcurrentLinkedQueue — منسلک نوڈس پر مبنی ایک غیر باؤنڈ دھاگے سے محفوظ قطار۔
  • DelayQueue — وقت پر مبنی نظام الاوقات قطار جس کی پشت پناہی ہیپ ہے۔
  • LinkedBlockingDeque - Deque انٹرفیس کا ایک ساتھ عمل درآمد۔
  • LinkedBlockingQueue - ایک اختیاری طور پر پابند FIFO بلاک کرنے والی قطار جس کی حمایت لنکڈ نوڈس کے ذریعے کی گئی ہے۔
  • لنکڈ لسٹ - لسٹ اور ڈیک انٹرفیس کا دوگنا لنکڈ لسٹ کا نفاذ۔ فہرست کی تمام اختیاری کارروائیوں کو نافذ کرتا ہے، اور تمام عناصر کو اجازت دیتا ہے (بشمول کالعدم)
  • LinkedTransferQueue — لنکڈ نوڈس پر مبنی ایک غیر پابند ٹرانسفر قطار
  • PriorityBlockingQueue — ایک ڈھیر کے ذریعے حمایت یافتہ غیر محدود مسدود کرنے والی ترجیحی قطار
  • PriorityQueue — ہیپ ڈیٹا سٹرکچر پر مبنی ایک ترجیحی قطار
  • SynchronousQueue — ایک مسدود کرنے والی قطار جہاں ہر داخل آپریشن کو دوسرے دھاگے کے ذریعے متعلقہ ہٹانے کے آپریشن کا انتظار کرنا چاہیے، اور اس کے برعکس۔
سب سے زیادہ مقبول نفاذ LinkedList، ArrayBlockingQueue اور PriorityQueue ہیں۔ آئیے ان کو دیکھتے ہیں اور بہتر سمجھنے کے لیے کچھ مثالیں دیتے ہیں۔

لنکڈ لسٹ

جاوا میں کلاس لنکڈ لسٹ لسٹ اور ڈیک انٹرفیس کو نافذ کرتی ہے۔ لہذا، یہ فہرست اور ڈیک کا ایک مجموعہ ہے، ایک دو طرفہ قطار، جو دونوں اطراف سے عناصر کو شامل کرنے اور ہٹانے کی حمایت کرتی ہے۔ جاوا میں LinkedList دوگنا لنکڈ لسٹ ہے: لسٹ کا ہر عنصر نوڈ کو کال کرتا ہے اور اس میں ایک آبجیکٹ اور دو پڑوسی اشیاء کا حوالہ ہوتا ہے - پچھلی اور اگلی۔ جاوا قطار انٹرفیس اور اس کے نفاذ - 2آپ کہہ سکتے ہیں کہ LinkedList میموری استعمال کرنے کے معاملے میں زیادہ موثر نہیں ہے۔ یہ سچ ہے، لیکن یہ ڈیٹا ڈھانچہ داخل اور حذف آپریشن کی کارکردگی کے معاملے میں مفید ہو سکتا ہے۔ تاہم یہ صرف اس صورت میں ہوتا ہے جب آپ ان کے لیے تکرار کرنے والے استعمال کرتے ہیں (اس صورت میں یہ مستقل وقت میں ہوتا ہے)۔ انڈیکس کے ذریعہ رسائی کی کارروائیاں مطلوبہ عنصر کے اختتام کے آغاز سے (جو بھی قریب ہو) تلاش کرکے انجام دی جاتی ہیں۔ تاہم، عناصر کے درمیان حوالہ جات کو ذخیرہ کرنے کے لیے اضافی اخراجات کے بارے میں مت بھولنا۔ لہذا، LinkedList جاوا میں سب سے زیادہ مقبول قطار کا نفاذ ہے۔ یہ List اور Deque کا بھی نفاذ ہے اور یہ ہمیں ایک دو طرفہ قطار بنانے کی اجازت دیتا ہے جس میں null سمیت کسی بھی چیز پر مشتمل ہو۔ LinkedList عناصر کا مجموعہ ہے۔
لنکڈ لسٹ کے بارے میں مزید: لنکڈ لسٹ جاوا ڈیٹا سٹرکچر

لنکڈ لسٹ کنسٹرکٹرز

پیرامیٹر کے بغیر LinkedList() کو خالی فہرست بنانے کے لیے استعمال کیا جاتا ہے۔ LinkedList(Collection<? extensions E> c) مخصوص مجموعہ کے عناصر پر مشتمل ایک فہرست بنانے کے لیے ہے، ترتیب میں، وہ مجموعہ کے تکرار کرنے والے کے ذریعے واپس کیے جاتے ہیں۔

مین لنکڈ لسٹ کے طریقے:

  • add(E عنصر) اس فہرست کے آخر میں مخصوص عنصر کو شامل کرتا ہے۔
  • add(int index, E عنصر) مخصوص پوزیشن انڈیکس پر عنصر داخل کرتا ہے۔
  • get(int index) عنصر کو اس فہرست میں مخصوص پوزیشن پر لوٹاتا ہے۔
  • remove(int index) عنصر کو ہٹاتا ہے جو پوزیشن انڈیکس پر ہے۔
  • remove(Object o) اس فہرست سے ?o عنصر کی پہلی موجودگی کو ہٹاتا ہے اگر یہ موجود ہے۔
  • remove() فہرست کے پہلے عنصر کو بازیافت اور ہٹاتا ہے۔
  • addFirst(), addLast() فہرست کے آغاز/آخر میں ایک عنصر شامل کریں۔
  • clear() فہرست سے تمام عناصر کو ہٹاتا ہے۔
  • contains(Object o) صحیح لوٹاتا ہے اگر فہرست میں o عنصر ہو۔
  • indexOf(Object o) o عنصر کی پہلی موجودگی کا اشاریہ واپس کرتا ہے، یا -1 اگر یہ فہرست میں نہیں ہے۔
  • سیٹ (int index, E عنصر) عنصر کو انڈیکس پوزیشن پر عنصر سے بدل دیتا ہے۔
  • size() فہرست میں عناصر کی مقدار لوٹاتا ہے۔
  • toArray() پہلے سے آخری عنصر تک فہرست کے تمام عناصر پر مشتمل ایک صف لوٹاتا ہے۔
  • pop() جو اسٹیک سے ایک عنصر کو پاپ کرتا ہے (فہرست کے ذریعہ پیش کیا جاتا ہے)
  • پش (ای ای) جو کسی عنصر کو اسٹیک پر دھکیلتا ہے (اس فہرست کے ذریعہ پیش کیا جاتا ہے)
جاوا قطار کی مثال - لنکڈ لسٹ (عناصر کو مختلف طریقوں سے ڈالنا اور ہٹانا)

import java.util.*;
 
public class LinkedListTest {
 
       public static void main(String args[]){
 
           LinkedList<Integer> myLinkedList= new LinkedList<Integer>();
           myLinkedList.add(1);
           myLinkedList.add(2);
           myLinkedList.add(4);
           System.out.println("three added elements: " + myLinkedList);
           //put one element into the head, not to the tail:
           myLinkedList.push(5);
           System.out.println("The new element last in will be the first: " + myLinkedList);
           //add new element at the specified position:
           myLinkedList.add(4,3);
           //put one element into the head, not to the tail (same as push):
           myLinkedList.addFirst(6);
           System.out.println(myLinkedList);
           //now remove element no 2 (it is 1):
           myLinkedList.remove(2);
           System.out.println(myLinkedList);
           //now remove the head of the list
           myLinkedList.pop();
           System.out.println(myLinkedList);
           //remove with the other method
           myLinkedList.remove();
           System.out.println(myLinkedList);
           //and with one more
           myLinkedList.poll();
           System.out.println(myLinkedList);
       }
       }

ترجیحی قطار

FIFO عمومی معنی میں ترجیحی قطار قطعی طور پر قطار نہیں ہے۔ ترجیحی قطار کے عناصر کو ان کی فطری ترتیب کے مطابق ترتیب دیا جاتا ہے، یا قطار کی تعمیر کے وقت فراہم کردہ موازنہ کنندہ کے ذریعہ، اس پر منحصر ہے کہ کنسٹرکٹر استعمال کیا جاتا ہے۔ تاہم یہ ایسا آرڈر نہیں ہے جیسا کہ یہ لکیری ڈھانچے میں ہو سکتا ہے جیسے فہرست (سب سے چھوٹی سے چھوٹی تک یا اس کے برعکس)۔ ترجیحی کم ہیپ کی بنیاد پر ترجیحی قطار۔ ہیپ بائنری ٹری پر مبنی ڈیٹا ڈھانچہ ہے ۔ ہر والدین کی ترجیح اس کے بچوں کی ترجیحات سے زیادہ ہوتی ہے۔ ایک درخت کو مکمل بائنری کہا جاتا ہے اگر ہر والدین کے دو سے زیادہ بچے نہ ہوں، اور سطحوں کی بھرائی اوپر سے نیچے تک جاتی ہے (ایک ہی سطح سے — بائیں سے دائیں تک)۔ بائنری ہیپ ہر بار جب بھی کوئی نیا عنصر شامل یا اس میں سے ہٹایا جاتا ہے خود کو دوبارہ منظم کرتا ہے۔ min-heap کی صورت میں، سب سے چھوٹا عنصر جڑ تک جاتا ہے قطع نظر اس کے داخل کرنے کی ترتیب۔ ترجیحی قطار اس min-heap پر مبنی ہے، لہذا اگر ہمارے پاس انٹیجرز کی PriorityQueue ہے، تو اس کا پہلا عنصر ان نمبروں میں سب سے چھوٹا ہوگا۔ اگر آپ جڑ کو حذف کرتے ہیں تو اگلی سب سے چھوٹی جڑ بن جاتی ہے۔

اہم ترجیحی قطار کے طریقے:

  • بولین ایڈ (آبجیکٹ) مخصوص عنصر کو ترجیحی قطار میں داخل کرتا ہے۔ کامیابی کی صورت میں درست لوٹتا ہے۔ اگر قطار بھری ہوئی ہے، تو طریقہ مستثنیٰ ہے۔
  • بولین پیشکش (آبجیکٹ) مخصوص عنصر کو اس ترجیحی قطار میں داخل کرتا ہے۔ اگر قطار بھری ہوئی ہے، تو طریقہ غلط لوٹاتا ہے۔
  • boolean remove(object) اس قطار سے مخصوص عنصر کی ایک مثال کو ہٹاتا ہے، اگر یہ موجود ہو۔
  • آبجیکٹ پول() اس قطار کے سر کو بازیافت اور ہٹاتا ہے۔ اگر قطار خالی ہو تو null لوٹاتا ہے۔
  • void clear() ترجیحی قطار سے تمام عناصر کو ہٹاتا ہے۔
  • آبجیکٹ عنصر() اس قطار کے سر کو ہٹائے بغیر بازیافت کرتا ہے۔ اگر قطار خالی ہو تو NoSuchElementException پھینک دیتا ہے۔
  • آبجیکٹ peek() قطار کے سر کو ہٹائے بغیر بازیافت کرتا ہے۔ اگر قطار خالی ہو تو null لوٹاتا ہے۔
  • boolean contains(Object o) صحیح لوٹاتا ہے اگر قطار میں o عنصر ہو۔
  • int size() اس قطار میں عناصر کی تعداد لوٹاتا ہے۔

ترجیحی قطار کی مثال


import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
 
public class PriorityQueueExample {
   public static void main(String[] args) {
 
       Queue<Integer> queueL = new LinkedList<>();
       for (int i = 5; i > 0; i--) {
           queueL.add(i);
       }
       System.out.println("Print our LinkedList Queue (FIFO): " + queueL);
       Queue<Integer> priorityQueue = new PriorityQueue<>();
 
       for (int i = 5; i > 0; i--) {
       priorityQueue.offer(i);
       }
 
       System.out.println("PriorityQueue printing (by iterating, no elements removing): " + priorityQueue);
       System.out.println("Print PriorityQueue using poll() (by retrieval): " );
       while (!priorityQueue.isEmpty()) {
           System.out.println(priorityQueue.poll());
       }
}
}
Print our LinkedList Queue (FIFO): [5, 4, 3, 2, 1]
PriorityQueue printing (by iterating, no elements removing): [1, 2, 4, 5, 3]
Print our  PriorityQueue using poll() (by retrieval): 
1
2
3
4
5
یہ سمجھنا ضروری ہے کہ ترجیحی قطاریں بائنری ہیپس پر مبنی ہوتی ہیں، اس لیے وہ عناصر کو لکیری ترتیب میں نہیں رکھتیں۔ جڑ سے پتے تک ہر راستے کا حکم ہے، لیکن جڑ سے مختلف طریقے نہیں ہیں۔ اس کا مطلب ہے کہ آپ قطار کا کم سے کم عنصر بہت جلد حاصل کر سکتے ہیں۔ اگر آپ ہر بار سر کو حذف کرتے ہیں، تو آپ ایک ترتیب شدہ ڈھانچہ پرنٹ کریں گے۔

ArrayBlockingQueue

ArrayBlockingQueue کا اندرونی ڈیٹا ڈھانچہ عناصر کو ذخیرہ کرنے کے لیے سرکلر سرنی پر مبنی ہے۔ یہ ایک عام قطار (FIFO) ہے اگر قطار کی دم پر نئے عناصر داخل کیے جاتے ہیں، اور نکالنے کی کارروائیاں قطار کے سر سے ایک عنصر واپس کرتی ہیں۔ کسی عنصر کو مکمل قطار میں ڈالنے (ڈالنے) کی کوششیں بہاؤ کو روکنے کا باعث بنتی ہیں۔ خالی قطار سے عنصر لینے کی کوشش کرنا بھی تھریڈ کو روکتا ہے۔ جیسا کہ ہم نے پہلے کہا، یہ صف سرکلر ہے۔ اس کا مطلب یہ ہے کہ صف کے پہلے اور آخری عناصر کو منطقی طور پر ملحق سمجھا جاتا ہے۔ جب بھی آپ عنصر کو قطار میں ڈالتے ہیں یا قطار سے ہٹاتے ہیں تو قطار سر اور دم کے عناصر کے اشاریوں کو آگے بڑھاتی ہے۔ اگر کچھ انڈیکس صف کے آخری عنصر کو آگے بڑھاتا ہے، تو یہ 0 سے دوبارہ شروع ہوتا ہے۔ اس لیے، سر ہٹانے کی صورت میں قطار کو تمام عناصر کو منتقل کرنے کی ضرورت نہیں ہے (جیسا کہ عام صف میں)۔ تاہم، درمیان سے کسی عنصر کو ہٹانے کی صورت میں (Iterator.remove کا استعمال کرتے ہوئے)، عناصر کو منتقل کر دیا جاتا ہے۔ ArrayBlockingQueue پروڈیوسرز (عناصر داخل کرنے) اور صارفین (عناصر نکالنے) کے انتظار کے بہاؤ کے کام کو ترتیب دینے کے لیے کنسٹرکٹر میں منصفانہ پیرامیٹر کے ساتھ ایک اضافی منصفانہ پالیسی کی حمایت کرتا ہے ۔ پہلے سے طے شدہ طور پر، آرڈر کی ضمانت نہیں ہے. تاہم اگر قطار "fair == true" کے ساتھ بنائی گئی ہے، تو ArrayBlockingQueue کلاس کا نفاذ FIFO آرڈر میں تھریڈ تک رسائی فراہم کرتا ہے۔ ایکویٹی عام طور پر بینڈوتھ کو کم کرتی ہے، لیکن اتار چڑھاؤ کو بھی کم کرتی ہے اور وسائل کے ختم ہونے سے روکتی ہے۔

ArrayBlockingQueue کلاس کنسٹرکٹرز

  • ArrayBlockingQueue (int گنجائش) مقررہ صلاحیت کی ایک قطار بناتا ہے اور پہلے سے طے شدہ رسائی کی پالیسی کے ساتھ۔
  • ArrayBlockingQueue (int Capacity، boolean fair) ایک مقررہ صلاحیت اور ایک مخصوص رسائی کی پالیسی کے ساتھ ایک قطار بناتا ہے۔
  • ArrayBlockingQueue (int Capacity, boolean fair, Collection <? extensed E> c) ایک قطار بناتا ہے جس کی ایک مقررہ صلاحیت رسائی کی پالیسی کے ذریعہ بیان کی گئی ہے اور اس میں قطار میں عناصر شامل ہوتے ہیں۔
یہاں ہمیں BlockingQueueExample مثال مل گئی ہے۔ ہم ایک عنصر اور ایک منصفانہ پرچم کی گنجائش کے ساتھ ArrayBlockingQueue کی ایک قطار بناتے ہیں۔ دو تھریڈ شروع ہو گئے ہیں۔ ان میں سے پہلا، پروڈیوسر تھریڈ، پوٹ میتھڈ کا استعمال کرتے ہوئے پیغامات کی صف سے پیغامات کی قطار لگاتا ہے۔ دوسرا، کنزیومر، تھریڈ ٹیک میتھڈ کا استعمال کرتے ہوئے قطار سے عناصر کو پڑھتا ہے اور انہیں کنسول میں دکھاتا ہے۔ عناصر کی ترتیب قطار کے لیے فطری ہے۔

import java.util.concurrent.*;
 
public class ArrayBlockingQueueExample {
 
   private BlockingQueue<Integer> blockingQueue;
   private final Integer[]  myArray = {1,2,3,4,5};
  
       public ArrayBlockingQueueExample ()
       { blockingQueue = new ArrayBlockingQueue<Integer>(1, true);
           (new Thread(new Producer())).start();
           (new Thread(new Consumer())).start();
       }
 
       class Producer implements Runnable
       {
           public void run() {
               try {
                   int counter = 0;
                   for (int i=0; i < myArray.length; i++) {
                       blockingQueue.put(myArray[i]);
                       if (counter++ < 2)
                           Thread.sleep(3000);
                   } blockingQueue.put(-1);
               }
               catch (InterruptedException e) {
                   System.err.println(e.getMessage());
               }
           }
       }
 
       class Consumer implements Runnable
       {
           public void run() {
               try {
                   Integer message = 0;
                   while (!((message = blockingQueue.take()).equals(-1)))
                       System.out.println(message);
               } catch (InterruptedException e) {
                   System.err.println(e.getMessage());
               }
           }
       }
 
       public static void main(String[] args) {
           new ArrayBlockingQueueExample();
       }
   }
آؤٹ پٹ قدرتی ترتیب میں قطار ہے؛ پہلے دو عناصر تاخیر کے ساتھ ظاہر ہوتے ہیں۔ جو کچھ آپ نے سیکھا ہے اس کو تقویت دینے کے لیے، ہم تجویز کرتے ہیں کہ آپ ہمارے جاوا کورس سے ایک ویڈیو سبق دیکھیں
  • قطار کو قطار کے آخر میں عناصر داخل کرنے کے لیے استعمال کیا جاتا ہے اور قطار کے آغاز سے ہٹا دیا جاتا ہے۔ یہ FIFO تصور کی پیروی کرتا ہے۔
  • Java Queue کلیکشن فریم ورک کا ایک حصہ ہے اور کلیکشن انٹرفیس کو لاگو کرتا ہے۔ لہذا یہ کلیکشن انٹرفیس کے تمام طریقوں کی حمایت کرتا ہے جیسے اندراج، حذف کرنا وغیرہ۔
  • قطار کے سب سے زیادہ استعمال ہونے والے نفاذ میں LinkedList، ArrayBlockingQueue اور PriorityQueue ہیں۔
  • ترجیحی قطار کے عناصر کو ان کی فطری ترتیب کے مطابق ترتیب دیا جاتا ہے، یا قطار کی تعمیر کے وقت فراہم کردہ موازنہ کنندہ کے ذریعہ، اس پر منحصر ہے کہ کنسٹرکٹر استعمال کیا جاتا ہے۔
  • اگر BlockingQueues پر کوئی null آپریشن کیا جاتا ہے تو NullPointerException پھینک دیا جاتا ہے۔
  • تبصرے
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION