مسئلا جيڪي ملٽي ٿريڊنگ جاوا ۾ حل ڪن ٿا
لازمي طور تي، جاوا ملٽي ٿريڊنگ ٻن مکيه مسئلن کي حل ڪرڻ لاءِ ايجاد ڪئي وئي:-
ساڳئي وقت ڪيترن ئي عملن کي انجام ڏيو.
مٿي ڏنل مثال ۾، مختلف موضوعن (يعني خاندان جي ميمبرن) متوازي طور تي ڪيترائي عمل ڪيا: برتن ڌوئي، دڪان تي ويا، شيون ٺاهي.
هڪ وڌيڪ "پروگرامر" مثال ڏئي سگهجي ٿو. تصور ڪريو ته توھان وٽ ھڪڙو پروگرام آھي جيڪو يوزر انٽرفيس سان. جڏهن جاري رکو بٽڻ کي دٻايو ويندو آهي، پروگرام جي اندر ڪجهه حساب ڪتاب ٿيڻ گهرجي، ۽ صارف کي هيٺين انٽرفيس اسڪرين کي ڏسڻ گهرجي. جيڪڏهن اهي ڪارناما ترتيب سان ڪيا وڃن، "جاري رکو" بٽڻ تي ڪلڪ ڪرڻ کان پوء، پروگرام صرف منجمد ٿي ويندو. صارف ساڳئي اسڪرين کي "جاري" بٽڻ سان ڏسندو جيستائين سڀئي اندروني حساب مڪمل ٿي وڃن ۽ پروگرام ان حصي تي پهچي جتي انٽرفيس ٺهڻ شروع ڪيو ويندو.
خير، اچو ته ڪجهه منٽن جو انتظار ڪريون!
اسان پنهنجي پروگرام کي ٻيهر ٺاهي سگهون ٿا، يا، جيئن پروگرامر چوندا آهن، "متوازي." اچو ته ضروري حسابن کي ھڪڙي سلسلي ۾ انجام ڏيو، ۽ ٻئي ۾ انٽرفيس رينجرنگ. گهڻن ڪمپيوٽرن وٽ هن لاءِ ڪافي وسيلا آهن. انهي حالت ۾، پروگرام "بيوقوف" نه ٿيندو، ۽ صارف خاموشيء سان انٽرفيس اسڪرين جي وچ ۾ منتقل ڪندو، بغير اندر اندر ڇا ٿي رهيو آهي. اهو مداخلت نٿو ڪري :)
-
حسابن کي تيز ڪريو.
هتي هر شيء بلڪل آسان آهي. جيڪڏھن اسان جي پروسيسر ۾ ڪيترائي ڪور آھن، ۽ گھڻا پروسيسر ھاڻي ملٽي-ڪور آھن، اسان جي ڪمن جي فهرست متوازي طور تي ڪيترن ئي ڪورن سان حل ڪري سگھجي ٿي. ظاهر آهي، جيڪڏهن اسان کي 1000 مسئلن کي حل ڪرڻ جي ضرورت آهي ۽ انهن مان هر هڪ سيڪنڊ ۾ حل ڪيو وڃي ٿو، هڪ ڪور 1000 سيڪنڊن ۾ لسٽ کي منهن ڏيندو، ٻه ڪور 500 سيڪنڊن ۾، ٽي صرف 333 سيڪنڊن ۾، وغيره.
Thread
. اهو آهي، 10 موضوعن کي ٺاهڻ ۽ هلائڻ لاء، توهان کي هن طبقي جي 10 شين جي ضرورت پوندي. اچو ته آسان ترين مثال لکون:
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
ٿريڊز ٺاهڻ ۽ لانچ ڪرڻ لاءِ، اسان کي ڪلاس ٺاهڻو پوندو ۽ ان کي وراثت ۾ آڻڻو پوندو java.lang
. Thread
۽ ان ۾ طريقي کي ختم ڪريو run()
. آخري هڪ تمام اهم آهي. اهو طريقو آهي ته run()
اسان منطق کي بيان ڪريون ٿا ته اسان جي موضوع تي عمل ڪرڻ گهرجي. ھاڻي، جيڪڏھن اسان ھڪڙو مثال ٺاھيو 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
جيڪي ورثي ۾ مليا آهن Thread
۽ انهن کي اعتراض جي طريقي سان سڏڻ سان لانچ ڪندا آهيون start()
. ڪنهن ميٿڊ کي سڏڻ کان پوءِ start()
ان جو طريقو ڪم ڪرڻ لڳندو آهي run()
۽ ان ۾ جيڪا منطق لکيل هوندي آهي، ان تي عمل ٿيندو آهي. مهرباني ڪري نوٽ ڪريو: موضوع جا نالا ترتيب ۾ نه آهن. اها ڏاڍي عجيب ڳالهه آهي، ڇو نه انهن کي بدلي ۾ قتل ڪيو ويو: ،،، Thread-0
وغيره ؟ اهو بلڪل هڪ مثال آهي جڏهن معياري، "ترتيباتي" سوچ ڪم نه ڪندي. حقيقت اها آهي ته هن معاملي ۾ اسان صرف 10 موضوع ٺاهڻ ۽ لانچ ڪرڻ لاء حڪم جاري ڪريون ٿا. ڪهڙي ترتيب ۾ انهن کي شروع ڪيو وڃي اهو فيصلو ڪيو ويو آهي ٿريڊ شيڊولر: آپريٽنگ سسٽم اندر هڪ خاص ميڪانيزم. اهو ڪيئن ٺهيو آهي ۽ ڪهڙي اصول تي اهو فيصلو ڪري ٿو، اهو هڪ تمام پيچيده موضوع آهي، ۽ اسان هاڻي ان تي غور نه ڪنداسين. ياد رکڻ جي بنيادي شيء اها آهي ته پروگرامر ٿريڊ جي عمل جي تسلسل کي ڪنٽرول نٿو ڪري سگهي. صورتحال جي سنگينيت کي محسوس ڪرڻ لاءِ، مٿي ڏنل مثال مان هڪ ٻه ڀيرا وڌيڪ طريقو هلائڻ جي ڪوشش ڪريو. ٻيو ڪنسول آئوٽ: مان ٿريڊ آهيان! منهنجو نالو آهي 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 آهيThread-1
Thread-2
main()
مسئلا جيڪي multithreading ٺاهي ٿو
ڪتابن جي مثال ۾، توهان ڏٺو ته ملٽي ٿريڊنگ ڪافي اهم مسئلا حل ڪري ٿي، ۽ ان جو استعمال اسان جي پروگرامن جي ڪم کي تيز ڪري ٿو. ڪيترن ئي ڪيسن ۾ - ڪيترائي ڀيرا. پر اهو ڪجهه به ناهي ته ملٽي ٿريڊنگ هڪ پيچيده موضوع سمجهي وڃي ٿي. آخرڪار، جيڪڏهن غلط استعمال ڪيو وڃي، اهو انهن کي حل ڪرڻ بدران مسئلا پيدا ڪري ٿو. جڏهن مان چوان ٿو ”مسئلا پيدا ڪريو،“ منهنجو مطلب ڪجهه خلاصو نه آهي. اتي ٻه خاص مسئلا آهن جيڪي ملٽي ٿريڊنگ سبب ٿي سگهن ٿيون: تعطل ۽ نسل جي حالت. Deadlock هڪ اهڙي صورتحال آهي جنهن ۾ ڪيترائي موضوع هڪ ٻئي تي قبضو ڪيل وسيلن جي انتظار ۾ آهن، ۽ انهن مان ڪو به جاري نه ٿو ڪري سگهي. اسان ان بابت مستقبل جي ليڪچرن ۾ وڌيڪ ڳالهائينداسين، پر هن وقت لاءِ هي مثال ڪافي ٿيندو: تصور ڪريو ته ٿريڊ-1 ڪجهه Object-1 سان ڪم ڪري رهيو آهي، ۽ thread-2 Object-2 سان ڪم ڪري رهيو آهي. پروگرام هن طرح لکيل آهي:- Thread-1 Object-1 سان ڪم ڪرڻ بند ڪري ڇڏيندو ۽ جيئن ئي Thread-2 Object-2 سان ڪم ڪرڻ بند ڪندو ۽ Object-1 ڏانهن سوئچ ڪندو.
- Thread-2 Object-2 سان ڪم ڪرڻ بند ڪندو ۽ جيئن ئي Thread-1 Object 1 سان ڪم ڪرڻ بند ڪندو ۽ Object-2 ڏانهن سوئچ ڪندو ته جيئن ئي Thread-1 Object-2 سان ڪم ڪرڻ بند ڪري.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("Выполнен поток " + 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 اسٽو تي موڙ. اسٽريم-2 هڪ فرائينگ پين ڪڍي ٿو ۽ ان کي اسٽو تي رکي ٿو. اسٽريم 3 اسٽو تي باهه ٻاري. وهڪرو 4 پين ۾ تيل وجهي. اسٽريم 5 انڊن کي ٽوڙي ٿو ۽ انھن کي فرائينگ پين ۾ وجھي ٿو. اسٽريم 6 شيل کي ڪچري جي بن ۾ اڇلائي ٿو. اسٽريم-7 گرميءَ کان ختم ٿيل انڊس کي ختم ڪري ٿو. پوٽوڪ-8 هڪ پليٽ تي ڇڪيل انڊا رکي ٿو. اسٽريم 9 برتن ڌوئڻ. اسان جي پروگرام جا نتيجا ڏسو: ٿريڊ-0 تي عملدرآمد ٿيل ٿريڊ-2 ٿريڊ تي عمل ڪيو ويو ٿريڊ-1 ٿريڊ تي عمل ڪيو ويو ٿريڊ-4 ٿريڊ تي عمل ڪيو ويو ٽريڊ-9 ٿريڊ تي عمل ڪيو ويو ٿريڊ-5 ٿريڊ تي عمل ڪيو ويو ٿريڊ-8 ٿريڊ تي عمل ڪيو ويو ٿريڊ-7 ٿريڊ تي عمل ڪيو ويو thread executed -3 Thread-6 thread execute. ڇا اسڪرپٽ مزيدار آهي؟ :). تسلسل جي معمولي خلاف ورزي تي، اسان جو باورچی خانه دوزخ ۾ بدلجي ٿو، ۽ هڪ روبوٽ چريو ٿي ويو آهي، ان جي چوڌاري هر شيء کي تباهه ڪري ٿو. اهو پڻ هڪ عام مسئلو آهي ملٽي ٿريڊ پروگرامنگ ۾، جنهن بابت توهان هڪ کان وڌيڪ ڀيرا ٻڌندا. ليڪچر جي آخر ۾، مان توهان کي ملٽي ٿريڊنگ تي هڪ ڪتاب جي سفارش ڪرڻ چاهيندس.
GO TO FULL VERSION