ملٽي ٿريڊنگ ذريعي مسئلا حل ڪيا ويا
ملٽي ٿريڊنگ اصل ۾ ٻن اهم مقصدن کي حاصل ڪرڻ لاءِ ايجاد ڪئي وئي هئي:-
ساڳئي وقت ڪيترائي ڪم ڪريو.
مٿين مثال ۾، مختلف موضوعن (خانداني ميمبرن) متوازي طور تي ڪيترائي ڪارناما انجام ڏنا: اهي برتن ڌوئي، دڪان ڏانهن ويا، ۽ شيون ڀريل.
اسان هڪ مثال پيش ڪري سگهون ٿا وڌيڪ ويجهي سان لاڳاپيل پروگرامنگ. فرض ڪريو توھان وٽ ھڪڙو پروگرام آھي جيڪو يوزر انٽرفيس سان. جڏهن توهان پروگرام ۾ 'جاري' تي ڪلڪ ڪندا، ڪجهه حساب ٿيڻ گهرجي ۽ صارف کي هيٺين اسڪرين ڏسڻ گهرجي. جيڪڏهن اهي ڪارناما ترتيب وار ڪيا ويا، ته پوءِ پروگرام صرف ان کان پوءِ لڪي ويندو جڏهن صارف 'جاري' بٽڻ تي ڪلڪ ڪندو. استعمال ڪندڙ اسڪرين کي 'جاري' بٽڻ جي اسڪرين سان ڏسندو جيستائين پروگرام سڀ اندروني حسابن کي انجام ڏئي ٿو ۽ ان حصي تي پهچي ٿو جتي يوزر انٽرفيس ريفريش ڪيو ويو آهي.
خير، مان سمجهان ٿو ته اسان ڪجهه منٽن جو انتظار ڪنداسين!
يا اسان پنهنجي پروگرام کي ٻيهر ڪم ڪري سگهون ٿا، يا، جيئن پروگرامر چون ٿا، ان کي 'متوازي'. اچو ته اسان جي حسابن کي ھڪڙي سلسلي ۾ انجام ڏيو ۽ ٻئي تي يوزر انٽرفيس ٺاھيو. گهڻو ڪري ڪمپيوٽرن وٽ ڪافي وسيلا آهن اهو ڪرڻ لاءِ. جيڪڏهن اسان اهو رستو اختيار ڪريون ٿا، ته پوءِ پروگرام منجمد نه ٿيندو ۽ صارف آسانيءَ سان اسڪرين جي وچ ۾ منتقل ٿي ويندو بغير ڪنهن پريشاني جي ته اندر ڇا ٿي رهيو آهي. هڪ ٻئي سان مداخلت نٿو ڪري :)
-
حساب ڪتاب کي وڌيڪ تيزيءَ سان انجام ڏيو.
هتي هر شيء بلڪل آسان آهي. جيڪڏهن اسان جي پروسيسر ۾ ڪيترائي ڪور آهن، ۽ اڄ اڪثر پروسيسر ڪندا آهن، پوء ڪيترائي ڪور اسان جي ڪمن جي فهرست کي متوازي ۾ سنڀالي سگھن ٿا. ظاهر آهي، جيڪڏهن اسان کي 1000 ڪمن کي انجام ڏيڻ جي ضرورت آهي ۽ هر هڪ سيڪنڊ وٺندو آهي، هڪ ڪور 1000 سيڪنڊن ۾ لسٽ ختم ڪري سگهي ٿو، ٻه ڪور 500 سيڪنڊن ۾، ٽي ٿورڙي ۾ 333 سيڪنڊن کان وڌيڪ، وغيره.
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 هڪ اهڙي صورتحال آهي جتي ڪيترائي موضوع هڪ ٻئي وٽ رکيل وسيلن جي انتظار ۾ آهن، ۽ انهن مان ڪو به جاري نه ٿو رهي سگهي. اسان ان بابت ايندڙ سبقن ۾ وڌيڪ ڳالهائينداسين. ھيٺ ڏنل مثال ھاڻي لاءِ ڪافي آھي: تصور ڪريو ته Thread-1 ڪنھن Object-1 سان رابطو ڪري ٿو، ۽ اھو Thread-2 Object-2 سان رابطو ڪري ٿو. ان کان علاوه، پروگرام لکيو ويو آهي ته جيئن:- Thread-1 Object-1 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-2 ڏانهن سوئچ ڪري ٿو جيئن ئي Thread-2 Object-2 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-1 ڏانهن سوئچ ڪري ٿو.
- Thread-2 Object-2 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-1 ڏانهن سوئچ ڪري ٿو جيئن ئي Thread-1 Object-1 سان رابطو ڪرڻ بند ڪري ٿو ۽ Object-2 ڏانهن سوئچ ڪري ٿو.
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 پروگرامنگ ۾. توهان ان جي باري ۾ هڪ کان وڌيڪ ڀيرا ٻڌو. هن سبق کي ختم ڪرڻ ۾، مان هڪ ڪتاب جي سفارش ڪرڻ چاهيان ٿو ملٽي ٿريڊنگ بابت. 'جاوا اتفاق راءِ عمل ۾' 2006 ۾ لکيو ويو، پر ان جي لاڳاپي کي نه وڃائي ڇڏيو آهي. اهو وقف آهي ملٽي ٿريڊ جاوا پروگرامنگ لاءِ - بنياديات کان وٺي سڀ کان عام غلطين ۽ اينٽي پيٽرن تائين. جيڪڏهن توهان ڪنهن ڏينهن هڪ ملٽي ٿريڊنگ گرو ٿيڻ جو فيصلو ڪيو، ته هي ڪتاب پڙهڻ لازمي آهي. ايندڙ سبقن ۾ ملنداسين! :)
GO TO FULL VERSION