JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ SynchronousQueue مثال - مسئلو حل ڪرڻ پروڊيوسر صارف...
profeg
سطح

جاوا ۾ SynchronousQueue مثال - مسئلو حل ڪرڻ پروڊيوسر صارف

گروپ ۾ شايع ٿيل
جاوا ۾ SynchronousQueue مثال - مسئلو حل ڪرڻ پروڊيوسر صارف
SynchronousQueue BlockingQueue جو هڪ خاص قسم آهي جنهن ۾ هر داخل آپريشن کي لازمي طور تي هڪ ٻئي سلسلي ۾ لاڳاپيل هٽائڻ واري حڪم جو انتظار ڪرڻو پوندو، ۽ ان جي برعڪس. جڏهن توهان هڪ SynchronousQueue تي put() ميٿڊ کي ڪال ڪريو ٿا ، اهو بلاڪ ٿي وڃي ٿو جيستائين ٻيو ٿريڊ ان عنصر مان نه وٺي. ان مطابق، جيڪڏهن ٻيو ٿريڊ ان مان هڪ عنصر کي هٽائڻ جي ڪوشش ڪري ٿو، ۽ عنصر اتي نه آهي، ته پوء اهو سلسلو بلاڪ ٿيندو جيستائين ٻيو ٿريڊ ان عنصر کي قطار ۾ رکي. توهان SynchronousQueue کي اولمپڪ مشعل سان ڊوڙندڙ هڪ ائٿليٽ ( ٿريڊ ) جي طور تي سمجهي سگهو ٿا، هو مشعل سان ڊوڙي ٿو (اها شئي جنهن تي گذري رهيو آهي) ۽ ان کي ٻئي طرف انتظار ڪندڙ ٻئي ايٿليٽ ڏانهن منتقل ڪري ٿو. جيڪڏھن توھان نالو ڏانھن ڌيان ڏيندا، توھان سمجھندا سين ته SynchronousQueue ھڪڙي سبب لاءِ رکيو ويو آھي؛ اھو ڊيٽا کي هم وقت سازي سان ٻئي سلسلي ۾ منتقل ڪري ٿو ؛ اهو انتظار ڪري ٿو ته ڪنهن کي ڊيٽا کڻڻ بدران صرف ان ۾ رکڻ ۽ نڪرڻ (هڪ هم وقت ساز آپريشن). جيڪڏهن توهان CSP ۽ Ada کان واقف آهيو، ته پوءِ توهان کي خبر آهي ته هم وقت سازي واريون قطارون ٿريڊن جي ملڻ سان ملندڙ جلندڙ آهن. اهي ڪنٽرول جي منتقلي جي تعميرات لاءِ مناسب آهن جن ۾ هڪ ٿريڊ ۾ هلندڙ شئي کي ڪنهن ٻئي سلسلي ۾ ڪنهن شئي سان هم وقت سازي ڪرڻ گهرجي ته جيئن ڪجهه معلومات، واقعو يا ڪم ان ڏانهن منتقل ڪيو وڃي. پوئين ملٽي ٿريڊ پروگرامنگ ٽيوٽوريل ۾، اسان سکيو ته ڪيئن پروڊيوسر-صارف جي مسئلي کي حل ڪيو وڃي انتظار ۽ اطلاع ۽ بلاڪنگ ڪيئي طريقا استعمال ڪندي . ھاڻي اسين سکنداسين ته ڪيئن لاڳو ڪجي پروڊيوسر-صارف جي نموني کي SynchronousQueue استعمال ڪندي. هي طبقو اضافي طور تي پروڊڪٽر ۽ صارفين جي سلسلي جي انتظار کي ترتيب ڏيڻ لاء منصفانه رويي جي حمايت ڪري ٿو. ڊفالٽ طور، هي آرڊر جي ضمانت نه آهي. جڏهن ته، منصفانه ملڪيتن سان ٺهيل قطارون FIFO (Firs In First Out) قطار ۾ موضوعن تائين رسائي جي ضمانت ڏين ٿيون .
پروڊيوسر/صارف جاوا ۾ SynchronousQueue استعمال ڪندي.
جاوا ۾ SynchronousQueue مثال - مسئلو حل ڪرڻ پروڊيوسر صارف - 1جيئن مون مٿي چيو آهي، ڪنهن به پروگرامنگ ٻوليءَ ۾ بين-ٿريڊ ڪميونيڪيشن کي سمجهڻ لاءِ پروڊيوسر-صارف جي مسئلي کان بهتر ٻيو ڪجهه به ناهي . هن مسئلي ۾، هڪ سلسلي هڪ پيداوار جي طور تي ڪم ڪري ٿو جيڪو واقعا ۽ ڪم پيدا ڪري ٿو، ۽ ٻيو سلسلو ان جي استعمال ڪندڙ طور ڪم ڪري ٿو. ھڪڙو گڏيل بفر استعمال ڪيو ويندو آھي ڊيٽا کي پروسيسر کان صارف ڏانھن منتقل ڪرڻ لاء. هن مسئلي کي حل ڪرڻ جي مشڪل انتهائي ڪيسن ۾ اچي ٿي، مثال طور، جڏهن ڪارخانو انتظار ڪرڻ تي مجبور آهي ڇاڪاڻ ته ... بفر مڪمل آهي يا صارف انتظار ڪرڻ تي مجبور آهي ڇاڪاڻ ته بفر خالي آهي. اهو آساني سان حل ڪيو ويو، ڇاڪاڻ ته ... بلاڪ ڪرڻ واري قطار نه صرف ڊيٽا کي محفوظ ڪرڻ لاءِ هڪ بفر مهيا ڪري ٿي، پر وهڪري جو ڪنٽرول پڻ، ٿريڊ کي بلاڪ ڪري رهيو آهي ته put() ميٿڊ (Producer) کي ڪال ڪري جيڪڏهن بفر مڪمل هجي، ۽ ٿريڊ کي بلاڪ ڪندي take() ميٿڊ (Consumer) کي سڏڻ جي صورت ۾ بفر خالي هو. ھاڻي اسان ھي ساڳيو مسئلو حل ڪنداسين SynchronousQueue استعمال ڪندي، ھڪ خاص قسم جو متوازي مجموعو صفر جي گنجائش سان. هيٺين مثال ۾، اسان وٽ ٻه ٿريڊ آهن جن کي PRODUCER ۽ CONSUMER چئبو آهي (هميشه ٿريڊن کي نالا ڏيو، هي ملٽي ٿريڊ پروگرامنگ جو تمام سٺو انداز آهي) پهرين ٿريڊ گيم ۾ اسڪور پوسٽ ڪري ٿي ۽ ٻيو ٿريڊ ان کي استعمال ڪري ٿو. راند ۾ اسڪور اسٽرنگ جي قسم کان وڌيڪ ڪجھ به نه آھي. پر جيڪڏهن توهان پروگرام کي مختلف قسم سان هلائيندا آهيو، توهان کي ڪو فرق محسوس نه ٿيندو. سمجھڻ لاءِ ته SynchronousQueue ڪيئن ڪم ڪري ٿي، ۽ پروڊيوسر-صارف جي مسئلي کي ڪيئن حل ڪجي، توھان کي گھرجي: يا ته پروگرام کي ڊيبگنگ (ڊيبگ) لاءِ Eclipse ماحول ۾ ھلايو ، يا صرف پروڊيوسر ٿريڊ کي شروع ڪريو commenter.start(); جيڪڏهن صارف ٿريڊ نه هلي رهيو آهي ته پوءِ پيدا ڪندڙ ٿريڊ بلاڪ ڪيو ويندو queue.put(event) تي؛ جيڪڏھن ھلائي رھيا آھيو، توھان ڏسي نه سگھندؤ پروڊيوسر [ProDUCER] شايع ڪندي: FOUR ايونٽ. اهو ٿئي ٿو ڇاڪاڻ ته SynchronousQueue جو مخصوص رويو، جيڪو يقيني بڻائي ٿو ته ٿريڊ پوسٽنگ ڊيٽا کي بلاڪ ڪيو ويندو جيستائين ٻيو ٿريڊ ڊيٽا نه وٺي، ۽ ان جي برعڪس. توھان باقي ڪوڊ کي جانچ ڪري سگھوٿا تبصرو ڪندي ڪندي producer.start(); ۽ صرف صارفين جي سلسلي کي شروع ڪندي. جيڪڏهن توهان احتياط سان پڙهو ته پروگرام ڇا نڪرندو آهي، توهان کي خبر پوندي ته آئوٽ جو آرڊر بدلجي ويو آهي. ائين ٿو لڳي ته [CONSUMER] ٿريڊ ڊيٽا کڻي ويو ان کان اڳ جو [PRODUCER] ٿريڊ ان کي پيدا ڪري. اهو ئي سبب آهي ته SynchronousQueue ڊفالٽ طور قطار جي ضمانت نٿو ڏئي. پر ان ۾ انصاف جا قاعدا آھن جيڪي FIFO آرڊر ۾ موضوعن تائين رسائي مقرر ڪن ٿا. توھان انھن قاعدن کي فعال ڪري سگھو ٿا سچو گذرڻ سان اوورلوڊ ٿيل SynchronousQueue ٺاھيندڙ ڏانھن: import java.util.concurrent.SynchronousQueue; /** * Java Program to solve Producer Consumer problem using SynchronousQueue. A * call to put() will block until there is a corresponding thread to take() that * element. * * @author Javin Paul */ public class SynchronousQueueDemo{ public static void main(String args[]) { final SynchronousQueue queue = new SynchronousQueue (); Thread producer = new Thread("PRODUCER") { public void run() { String event = "FOUR"; try { queue.put(event); // thread will block here System.out.printf("[%s] published event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; producer.start(); // starting publisher thread Thread consumer = new Thread("CONSUMER") { public void run() { try { String event = queue.take(); // thread will block here System.out.printf("[%s] consumed event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; consumer.start(); // starting consumer thread } } Output: [CONSUMER] consumed event : FOUR [PRODUCER] published event : FOUR new SynchronousQueue(boolean fair).
جاوا ۾ SynchronousQueue بابت توهان کي ڇا ياد رکڻ جي ضرورت آهي.

هتي جاوا ۾ هن خاص قسم جي بلاڪنگ قطار جا ڪجهه اهم خاصيتون آهن. اهو تمام مفيد آهي ڊيٽا کي هڪ سلسلي کان ٻئي تائين هڪ هم وقت ساز انداز ۾ منتقل ڪرڻ. ھن قطار ۾ ڪا گنجائش نه آھي ۽ بند ٿيل آھي جيستائين ٻيو ٿريڊ ان کي آزاد نه ڪري.

  1. SynchronousQueue بلاڪ، ۽ جيستائين ھڪڙو سلسلو ڊيٽا وٺڻ لاء تيار آھي، ٻيو ڊيٽا رکڻ جي ڪوشش ڪندو.
  2. SynchronousQueue جو ڪو حجم نه آھي. اهو آهي، اهو ڊيٽا تي مشتمل ناهي.
  3. SynchronousQueue استعمال ڪيو ويندو آھي اڳتي وڌڻ واري حڪمت عملي تي عمل ڪرڻ لاءِ، جتي ھڪڙو ٿريڊ ڪنٽرول پاس ڪري ٿو انتظار واري سلسلي کي، يا جيڪڏھن اجازت ڏني وڃي ته نئون ٺاھي ٿو، ٻي صورت ۾ ڪنٽرول منتقل نه ڪيو ويندو آھي.
  4. هي قطار null ڊيٽا جي اجازت نٿو ڏئي. هڪ null عنصر شامل ڪرڻ جي ڪوشش NullPointerException اڇلائي ويندي .
  5. جيڪڏهن توهان گڏ ڪرڻ کان ٻيا طريقا استعمال ڪندا آهيو (جهڙوڪ شامل آهن)، SynchronousQueue هڪ خالي مجموعو وانگر عمل ڪندو آهي.
  6. توھان استعمال نٿا ڪري سگھو SynchronousQueue جي جھلڪ جو طريقو ڇو جو عنصر صرف موجود آھي جڏھن توھان ان کي ختم ڪرڻ جي ڪوشش ڪريو؛ انهي سان گڏ، توهان عناصر داخل ڪرڻ جي قابل نه هوندا (ڪنهن به طريقي سان استعمال ڪندي) جيستائين ٻيو موضوع ان کي هٽائڻ جي ڪوشش نه ڪندو.
  7. توهان Synchronous Queue لاءِ آئٽرٽر استعمال ڪرڻ جي قابل نه هوندا ڇو ته... ان ۾ ڪوبه عنصر نه آهي.
  8. SynchronousQueue منصفانه ضابطن سان ٺاهي سگھجن ٿيون جتي FIFO آرڊر ۾ موضوعن تائين رسائي جي ضمانت آهي.
شايد اهو سڀ ڪجهه جاوا ۾ SynchronousQueue بابت آهي. اسان ھن گھڻن موضوعن واري مجموعن جي ڪجھ خاص خصوصيتن تي غور ڪيو، ۽ سکيو ته جاوا ۾ SynchronousQueue استعمال ڪندي کلاسک پروڊيوسر-صارف جو مسئلو ڪيئن حل ڪجي. رستي ۾، ان کي قطار سڏڻ بلڪل صحيح ناهي، ڇاڪاڻ ته ... ان ۾ عناصر شامل نه آهن. ڪال to put() مڪمل نه ٿيندي جيستائين ٻي ٿريڊ ڪال نه ٿيندي take(). اهو وڌيڪ صحيح آهي ته ان کي سلسلا جي گڏجاڻي جي جڳهه وانگر، جتي اهي هڪ اعتراض حصيداري ڪندا آهن. ٻين لفظن ۾، اهو جاوا ۾ شين جي هم وقت سازي جي گذرڻ لاءِ هڪ افاديت آهي، شايد انتظار ۽ اطلاع واري طريقي جو هڪ محفوظ متبادل .
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION