CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ ملٽي ٿريڊنگ
John Squirrels
سطح
San Francisco

جاوا ۾ ملٽي ٿريڊنگ

گروپ ۾ شايع ٿيل
سلام سڀ کان پهريان، مبارڪون: توهان جاوا ۾ Multithreading جي موضوع تي پهچي ويا آهيو! هي هڪ سنگين ڪاميابي آهي - توهان هڪ ڊگهو رستو وٺي آيا آهيو. پر پنهنجو پاڻ کي تيار ڪريو: هي ڪورس ۾ سڀ کان ڏکيو موضوعن مان هڪ آهي. ۽ اهو نه آهي ته اسان هتي پيچيده ڪلاس يا ڪيترائي طريقا استعمال ڪري رهيا آهيون: حقيقت ۾، اسان ويهن کان گهٽ استعمال ڪنداسين. اهو وڌيڪ آهي ته توهان کي تبديل ڪرڻو پوندو ته توهان ڪيئن سوچيو ٿا. اڳي، توهان جا پروگرام ترتيب سان جاري ڪيا ويا آهن. ڪوڊ جون ڪجھ لائينون ٻين کان پوءِ آيون، ڪجھ طريقا ٻين کان پوءِ آيا، ۽ سڀ ڪجھ بنيادي طور تي واضح ھو. پهرين، اسان ڪجهه حساب ڪيو، پوء ڏيکاريل نتيجو ڪنسول تي، ۽ پوء پروگرام ختم ٿي ويو. ملٽي ٿريڊنگ کي سمجهڻ لاءِ، اهو بهتر آهي ته متوازي جي لحاظ کان سوچڻ. اچو ته ڪجهه سادو سان شروع ڪريون :) تصور ڪريو ته توهان جو خاندان هڪ گهر کان ٻئي ڏانهن منتقل ٿي رهيو آهي. گڏ ڪرڻ توهان جي سڀني ڪتابن کي گڏ ڪرڻ جو هڪ اهم حصو هوندو. توهان تمام گهڻا ڪتاب گڏ ڪيا آهن، ۽ توهان کي انهن کي دٻي ۾ رکڻو پوندو. في الحال، توهان صرف هڪ موجود آهيو. ماءُ کاڌو تيار ڪري رهي آهي، ڀاءُ ڪپڙا پيڪ ڪري رهيو آهي، ۽ ڀيڻ دڪان ڏانهن هلي وئي. اڪيلو، توهان ڪنهن به طريقي سان منظم ڪري سگهو ٿا. جلدي يا بعد ۾، توهان پنهنجو ڪم مڪمل ڪنداسين، پر اهو گهڻو وقت وٺندو. تنهن هوندي، توهان جي ڀيڻ 20 منٽن ۾ دڪان تان واپس ايندي، ۽ هن وٽ ٻيو ڪجهه به ناهي. تنهنڪري هوءَ توهان سان شامل ٿي سگهي ٿي. ڪم تبديل نه ڪيو آهي: ڪتابن کي دٻي ۾ وجهي. پر اهو ٻه ڀيرا تيزيء سان ڪيو پيو وڃي. ڇو؟ ڇاڪاڻ ته ڪم هڪجهڙائي سان ٿي رهيو آهي. ٻه مختلف ’سلسليون‘ (توهان ۽ توهان جي ڀيڻ) هڪ ئي وقت ساڳيو ڪم سرانجام ڏئي رهيا آهن. ۽ جيڪڏهن ڪجھ به نه بدلجي، ته پوءِ ان صورتحال جي مقابلي ۾ وقت جو وڏو فرق هوندو جتي توهان پنهنجو پاڻ سڀ ڪجهه ڪندا آهيو. جيڪڏھن ڀاءُ پنھنجو ڪم جلد ختم ڪري، اھو توھان جي مدد ڪري سگھي ٿو ۽ شيون اڃا به تيز ٿي وينديون.

ملٽي ٿريڊنگ ذريعي مسئلا حل ڪيا ويا

ملٽي ٿريڊنگ اصل ۾ ٻن اهم مقصدن کي حاصل ڪرڻ لاءِ ايجاد ڪئي وئي هئي:
  1. ساڳئي وقت ڪيترائي ڪم ڪريو.

    مٿين مثال ۾، مختلف موضوعن (خانداني ميمبرن) متوازي طور تي ڪيترائي ڪارناما انجام ڏنا: اهي برتن ڌوئي، دڪان ڏانهن ويا، ۽ شيون ڀريل.

    اسان هڪ مثال پيش ڪري سگهون ٿا وڌيڪ ويجهي سان لاڳاپيل پروگرامنگ. فرض ڪريو توھان وٽ ھڪڙو پروگرام آھي جيڪو يوزر انٽرفيس سان. جڏهن توهان پروگرام ۾ 'جاري' تي ڪلڪ ڪندا، ڪجهه حساب ٿيڻ گهرجي ۽ صارف کي هيٺين اسڪرين ڏسڻ گهرجي. جيڪڏهن اهي ڪارناما ترتيب وار ڪيا ويا، ته پوءِ پروگرام صرف ان کان پوءِ لڪي ويندو جڏهن صارف 'جاري' بٽڻ تي ڪلڪ ڪندو. استعمال ڪندڙ اسڪرين کي 'جاري' بٽڻ جي اسڪرين سان ڏسندو جيستائين پروگرام سڀ اندروني حسابن کي انجام ڏئي ٿو ۽ ان حصي تي پهچي ٿو جتي يوزر انٽرفيس ريفريش ڪيو ويو آهي.

    خير، مان سمجهان ٿو ته اسان ڪجهه منٽن جو انتظار ڪنداسين!

    جاوا ۾ ملٽي ٽريڊنگ: اهو ڇا آهي، ان جا فائدا ۽ عام نقصان - 3

    يا اسان پنهنجي پروگرام کي ٻيهر ڪم ڪري سگهون ٿا، يا، جيئن پروگرامر چون ٿا، ان کي 'متوازي'. اچو ته اسان جي حسابن کي ھڪڙي سلسلي ۾ انجام ڏيو ۽ ٻئي تي يوزر انٽرفيس ٺاھيو. گهڻو ڪري ڪمپيوٽرن وٽ ڪافي وسيلا آهن اهو ڪرڻ لاءِ. جيڪڏهن اسان اهو رستو اختيار ڪريون ٿا، ته پوءِ پروگرام منجمد نه ٿيندو ۽ صارف آسانيءَ سان اسڪرين جي وچ ۾ منتقل ٿي ويندو بغير ڪنهن پريشاني جي ته اندر ڇا ٿي رهيو آهي. هڪ ٻئي سان مداخلت نٿو ڪري :)

  2. حساب ڪتاب کي وڌيڪ تيزيءَ سان انجام ڏيو.

    هتي هر شيء بلڪل آسان آهي. جيڪڏهن اسان جي پروسيسر ۾ ڪيترائي ڪور آهن، ۽ اڄ اڪثر پروسيسر ڪندا آهن، پوء ڪيترائي ڪور اسان جي ڪمن جي فهرست کي متوازي ۾ سنڀالي سگھن ٿا. ظاهر آهي، جيڪڏهن اسان کي 1000 ڪمن کي انجام ڏيڻ جي ضرورت آهي ۽ هر هڪ سيڪنڊ وٺندو آهي، هڪ ڪور 1000 سيڪنڊن ۾ لسٽ ختم ڪري سگهي ٿو، ٻه ڪور 500 سيڪنڊن ۾، ٽي ٿورڙي ۾ 333 سيڪنڊن کان وڌيڪ، وغيره.

پر جيئن توهان هن سبق ۾ اڳي ئي پڙهي چڪا آهيو، اڄ جا سسٽم ڏاڍا سمارٽ آهن، ۽ هڪ ڪمپيوٽنگ ڪور تي به برابري حاصل ڪرڻ جي قابل آهن، يا بلڪه pseudo-paralelism، جتي ڪم متبادل طور تي ڪيا ويندا آهن. اچو ته عامات کي خصوصيات ڏانهن منتقل ڪريون ۽ جاوا ملٽي ٿريڊنگ لائبريري — java.lang.Thread ۾ سڀ کان اهم طبقي کي ڄاڻون. سختي سان ڳالهائڻ، جاوا ٿريڊز ٿريڊ ڪلاس جي مثالن جي نمائندگي ڪن ٿا. هن جو مطلب آهي ته 10 سلسلا ٺاهڻ ۽ هلائڻ لاء، توهان کي هن طبقي جا 10 مثالن جي ضرورت آهي. اچو ته آسان ترين مثال لکون:
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("I'm Thread! My name is " + getName());
   }
}
ٿريڊس ٺاهڻ ۽ هلائڻ لاءِ، اسان کي ڪلاس ٺاهڻو پوندو، ان کي وارث بڻايو java.lang . ٿريڊ ڪلاس، ۽ ان جي رن () طريقي کي ختم ڪريو. اها آخري گهرج تمام ضروري آهي. اهو رن () طريقو ۾ آهي ته اسان منطق جي وضاحت ڪريون ٿا اسان جي سلسلي لاءِ عمل ڪرڻ لاءِ. هاڻي، جيڪڏهن اسان MyFirstThread جو هڪ مثال ٺاهي ۽ هلائيندا آهيون ، ته run() طريقو نالي سان هڪ لڪير ڏيکاريندو: getName() طريقو ٿريڊ جو 'سسٽم' نالو ڏيکاري ٿو، جيڪو خودڪار طور تي لڳايو ويو آهي. پر اسان عارضي طور تي ڇو ڳالهائي رهيا آهيون؟ اچو ته هڪ ٺاهيو ۽ ڳولهيو!
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {

           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
ڪنسول آئوٽ: مان ٿريڊ آهيان! منهنجو نالو Thread-2 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-1 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-0 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-3 مان ٿريڊ آهيان! منهنجو نالو Thread-6 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-7 مان ٿريڊ آهيان! منهنجو نالو Thread-4 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-5 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-9 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-8 اچو ته 10 ٿريڊس ٺاهيون ( MyFirstThread Objects، جيڪي Thread کي ورثي ۾ ڏين ٿيون) ۽ هر شئي تي start() ميٿڊ کي ڪال ڪري انهن کي شروع ڪريون . start() ميٿڊ کي ڪال ڪرڻ کان پوءِ ، رن() طريقي ۾ منطق تي عمل ڪيو ويندو آهي. نوٽ: سلسلي جا نالا ترتيب ۾ نه آهن. اهو عجيب آهي ته اهي ترتيب وار نه هئا: Thread-0 ، Thread-1 ، Thread-2 ، وغيره؟ جيئن ته اهو ٿئي ٿو، اهو هڪ وقت جو هڪ مثال آهي جڏهن 'ترتيباتي' سوچ مناسب ناهي. مسئلو اهو آهي ته اسان صرف 10 موضوعن کي ٺاهڻ ۽ هلائڻ لاءِ حڪم ڏنو آهي. ٿريڊ شيڊولر، هڪ خاص آپريٽنگ سسٽم ميڪانيزم، انهن جي عمل جي حڪم جو فيصلو ڪري ٿو. ان جي صحيح ڊيزائن ۽ فيصلا ڪرڻ واري حڪمت عملي هڪ گہرے بحث لاءِ موضوع آهن جن تي اسان في الحال غور نه ڪنداسين. ياد رکڻ لاءِ بنيادي شيءِ اها آهي ته پروگرامر ٿريڊز جي عمل جي حڪم کي ڪنٽرول نٿو ڪري سگهي. صورتحال جي سنگيني کي سمجھڻ لاءِ، مٿي ڏنل مثال ۾ main() طريقي کي ٻه ڀيرا وڌيڪ هلائڻ جي ڪوشش ڪريو. ٻي رن تي ڪنسول آئوٽ: مان ٿريڊ آهيان! منهنجو نالو آهي Thread-0 مان ٿريڊ آهيان! منهنجو نالو Thread-4 آهي مان ٿريڊ آهيان! منهنجو نالو Thread-3 آهي مان ٿريڊ آهيان! منهنجو نالو Thread-2 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-1 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-5 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-6 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-8 مان ٿريڊ آهيان! منهنجو نالو Thread-9 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-7 ڪنسول آئوٽ ٽين رن مان: مان ٿريڊ آهيان! منهنجو نالو آهي Thread-0 مان ٿريڊ آهيان! منهنجو نالو Thread-3 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-1 مان ٿريڊ آهيان! منهنجو نالو Thread-2 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-6 مان ٿريڊ آهيان! منهنجو نالو Thread-4 آهي مان ٿريڊ آهيان! منهنجو نالو Thread-9 آهي مان ٿريڊ آهيان! منهنجو نالو آهي Thread-5 مان ٿريڊ آهيان! منهنجو نالو آهي Thread-7 مان ٿريڊ آهيان! منهنجو نالو Thread-8 آهي

ملٽي ٿريڊنگ ذريعي پيدا ٿيل مسئلا

ڪتابن سان گڏ اسان جي مثال ۾، توهان ڏٺو ته ملٽي ٽريڊنگ تمام اهم ڪم حل ڪري ٿي ۽ اسان جي پروگرامن کي تيز ڪري سگهي ٿي. گهڻو ڪري ڪيترائي ڀيرا تيز. پر multithreading هڪ ڏکيو موضوع سمجهيو ويندو آهي. درحقيقت، جيڪڏهن غلط استعمال ڪيو وڃي، اهو انهن کي حل ڪرڻ بدران مسئلا پيدا ڪري ٿو. جڏهن مان چوان ٿو 'مسئلا پيدا ڪري ٿو'، منهنجو مطلب ڪجهه تجريدي معنى ۾ نه آهي. اتي ٻه خاص مسئلا آھن جيڪي ملٽي ٿريڊنگ ڪري سگھن ٿيون: تعطل ۽ نسل جون حالتون. Deadlock هڪ اهڙي صورتحال آهي جتي ڪيترائي موضوع هڪ ٻئي وٽ رکيل وسيلن جي انتظار ۾ آهن، ۽ انهن مان ڪو به جاري نه ٿو رهي سگهي. اسان ان بابت ايندڙ سبقن ۾ وڌيڪ ڳالهائينداسين. ھيٺ ڏنل مثال ھاڻي لاءِ ڪافي آھي: جاوا ۾ ملٽي ٿريڊنگ: اهو ڇا آهي، ان جا فائدا ۽ عام نقصان - 4تصور ڪريو ته Thread-1 ڪنھن Object-1 سان رابطو ڪري ٿو، ۽ اھو Thread-2 Object-2 سان رابطو ڪري ٿو. ان کان علاوه، پروگرام لکيو ويو آهي ته جيئن:
  1. Thread-1 Object-1 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-2 ڏانهن سوئچ ڪري ٿو جيئن ئي Thread-2 Object-2 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-1 ڏانهن سوئچ ڪري ٿو.
  2. Thread-2 Object-2 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-1 ڏانهن سوئچ ڪري ٿو جيئن ئي Thread-1 Object-1 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-2 ڏانهن سوئچ ڪري ٿو.
جيتوڻيڪ multithreading جي تمام گهڻي ڄاڻ کان سواء، توهان آساني سان ڏسي سگهو ٿا ته ڪجھ به نه ٿيندو. موضوع ڪڏهن به جڳهون مٽائي نه سگهندا ۽ هميشه هڪ ٻئي جو انتظار ڪندا. غلطي ظاهر لڳي ٿي، پر حقيقت ۾ اهو ناهي. توهان آساني سان هن پروگرام ۾ ڪري سگهو ٿا. اسان ڪوڊ جي مثالن تي غور ڪنداسين جيڪي ايندڙ سبقن ۾ تعطل جو سبب بڻجن ٿا. رستي جي ذريعي، ڪوورا هڪ عظيم حقيقي زندگي جو مثال آهي جيڪو وضاحت ڪري ٿو ته تعطل ڇا آهي. ”هندستان جي ڪجهه رياستن ۾، اهي توهان کي زرعي زمين نه وڪڻندا جيستائين توهان رجسٽرڊ هاري نه آهيو. بهرحال، اهي توهان کي هاريءَ جي طور تي رجسٽر نه ڪندا جيڪڏهن توهان وٽ زرعي زمين نه آهي. زبردست! اسان ڇا چئي سگهون ٿا؟! :) هاڻي اچو ته نسل جي حالتن بابت ڳالهايون. هڪ نسل جي حالت هڪ گھڻائي واري نظام يا ايپليڪيشن ۾ هڪ ڊزائن جي غلطي آهي، جتي سسٽم يا ايپليڪيشن جو آپريشن ان حڪم تي منحصر آهي جنهن ۾ ڪوڊ جا حصا جاري ڪيا ويا آهن. ياد رکو، اسان جو مثال جتي اسان موضوع شروع ڪيو:
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("Thread executed: " + getName());
   }
}

public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {

           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
هاڻي تصور ڪريو ته پروگرام هڪ روبوٽ هلائڻ جو ذميوار آهي جيڪو کاڌو پچائي ٿو! Thread-0 فرج مان انڊا ڪڍي ٿو. ٿريڊ- 1 اسٽو تي ڦرندو آهي. Thread-2 هڪ پان حاصل ڪري ان کي اسٽو تي رکي ٿو. ٿريڊ-3 اسٽو کي روشن ڪري ٿو. ٿريڊ- 4 تيل کي ٿانو ۾ وجهي ٿو. ٿريڊ-5 انڊن کي ٽوڙي پين ۾ وجهي ٿو. ٿريڊ-6 آنڊن جي ڇيڻن کي ڪچري واري دٻي ۾ اڇلائي ٿو. Thread-7 برنر مان پکا ٿيل انڊا ڪڍي ٿو. Thread-8 هڪ پليٽ تي پکا انڊس رکي ٿو. Thread-9 برتن ڌوئي ٿو. اسان جي پروگرام جا نتيجا ڏسو: ٿريڊ تي عمل ڪيو ويو: ٿريڊ-0 ٿريڊ تي عمل ڪيو ويو: ٿريڊ-2 ٿريڊ تي عمل ڪيو ويو: ٽريڊ-2 ٿريڊ تي عمل ڪيو ويو: ٽريڊ-4 ٿريڊ تي عمل ڪيو ويو: ٽريڊ-9 موضوع تي عمل ڪيو ويو: ٽريڊ-5 ٿريڊ جاري ڪيو ويو: ٿريڊ-8 ٿريڊ executed: Thread-7 Thread executeed: Thread-3 ڇا هي ڪا مزاحيه روٽين آهي؟ :) ۽ سڀ ڇو ته اسان جي پروگرام جو ڪم ٿريڊز جي عمل جي حڪم تي منحصر آهي. گهربل ترتيب جي معمولي خلاف ورزي جي ڪري، اسان جو باورچی خانه دوزخ ۾ بدلجي ٿو، ۽ هڪ چريو روبوٽ ان جي چوڌاري هر شيء کي تباهه ڪري ٿو. اهو به هڪ عام مسئلو آهي multithreaded پروگرامنگ ۾. توهان ان جي باري ۾ هڪ کان وڌيڪ ڀيرا ٻڌو. هن سبق کي ختم ڪرڻ ۾، مان هڪ ڪتاب جي سفارش ڪرڻ چاهيان ٿو ملٽي ٿريڊنگ بابت. جاوا ۾ ملٽي ٽريڊنگ: اهو ڇا آهي، ان جا فائدا ۽ عام نقصان - 6'جاوا اتفاق راءِ عمل ۾' 2006 ۾ لکيو ويو، پر ان جي لاڳاپي کي نه وڃائي ڇڏيو آهي. اهو وقف آهي ملٽي ٿريڊ جاوا پروگرامنگ لاءِ - بنياديات کان وٺي سڀ کان عام غلطين ۽ اينٽي پيٽرن تائين. جيڪڏهن توهان ڪنهن ڏينهن هڪ ملٽي ٿريڊنگ گرو ٿيڻ جو فيصلو ڪيو، ته هي ڪتاب پڙهڻ لازمي آهي. ايندڙ سبقن ۾ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION