JavaRush /جاوا بلاگ /Random-SD /ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا ڪهڙا طريقا ڪندا آهن

ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا ڪهڙا طريقا ڪندا آهن

گروپ ۾ شايع ٿيل
سلام! اڄ اسان multithreading بابت ڳالهائڻ جاري رکون ٿا. اچو ته ٿريڊ ڪلاس تي هڪ نظر رکون ۽ ان جا ڪيترائي طريقا ڪيئن ڪم ڪن ٿا. اڳي، جڏهن اسان ڪلاس جي طريقن جو اڀياس ڪيو، اسان اڪثر ڪري ان کي هن طرح لکيو آهي: "طريقي جو نالو" -> "اهو ڇا ڪري ٿو."
ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا طريقا ڇا ڪن ٿا - 1
هي ٿريڊ طريقن سان ڪم نه ڪندو :) انهن جي منطق وڌيڪ پيچيده آهي، ۽ ڪيترن ئي مثالن کان سواء اهو سمجهڻ ناممڪن آهي.

Thread.start() طريقو

اچو ته ورجائي سان شروع ڪريون. جيئن توهان کي ياد هوندو ته، توهان هڪ ٿريڊ ٺاهي سگهو ٿا ڪلاس مان پنهنجي ڪلاس کي وراثت ۾ وٺي Thread۽ ان ۾ طريقي کي ختم ڪندي run(). پر، يقينا، اهو پنهنجو پاڻ تي شروع نه ٿيندو. هن کي ڪرڻ لاء، اسان کي اسان جي اعتراض تي طريقو سڏين ٿا start(). ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا طريقا ڇا ڪندا آهن - 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();
       }
   }
}
مهرباني ڪري نوٽ ڪريو: هڪ موضوع شروع ڪرڻ لاء، توهان کي خاص طريقي سان سڏڻ گهرجيstart()، نهrun()! اهو ٺاهڻ ۾ هڪ آسان غلطي آهي، خاص طور تي جڏهن پهريون ڀيرو ملٽي ٽريڊنگ سکڻ. run()جيڪڏهن اسان جي مثال ۾ توهان 10 ڀيرا بدراناعتراض جي طريقي کي سڏيندوstart()، نتيجو هن طرح ٿيندو:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
ٿريڊ-0 سلسلي تي عمل ڪيو ويو ٿريڊ-1 ٿريڊ تي عمل ڪيو ويو ٿريڊ-2 ٿريڊ تي عمل ڪيو ويو ٿريڊ-3 سلسلي تي عمل ڪيو ويو ٿريڊ-4 ٿريڊ تي عمل ڪيو ويو ٽريڊ-5 ٿريڊ تي عمل ڪيو ويو ٿريڊ-6 ٿريڊ تي عمل ڪيو ويو ٽريڊ-7 ٿريڊ تي عمل ڪيو ويو-8 سلسلي تي عمل ڪيو ويو9 ٻاھرين جي ترتيب کي ڏسو: سڀڪنھن شيء کي سختي سان ترتيب ڏئي ٿو. عجيب، صحيح؟ اسان کي ان لاءِ عادت نه آهي، ڇاڪاڻ ته اسان اڳ ۾ ئي ڄاڻون ٿا ته اهو حڪم جنهن ۾ ٿريڊز شروع ڪيا ويندا آهن ۽ ان تي عمل ڪيو ويندو آهي، اهو اسان جي آپريٽنگ سسٽم جي اندر سپر انٽيليجنس يعني ٿريڊ شيڊيولر طرفان طئي ڪيو ويندو آهي. ٿي سگهي ٿو ته مان صرف خوش قسمت هوس؟ يقينن، اها قسمت جي ڳالهه ناهي. توھان ان جي تصديق ڪري سگھوٿا پروگرام هلائڻ سان ڪجھ وڌيڪ ڀيرا. نقطي اهو آهي ته هڪ طريقي سان سڏڻ جو سڌو سنئونrun()ملٽي ٽريڊنگ سان ڪو به واسطو ناهي. انهي صورت ۾، پروگرام کي مکيه سلسلي ۾ عمل ڪيو ويندو - هڪ جنهن ۾ طريقي سان عمل ڪيو ويندو آهيmain(). اهو صرف 10 لائنن کي ترتيب سان ڪنسول ڏانهن آڻيندو ۽ بس. نه 10 موضوع شروع ٿيندا. تنهن ڪري، مستقبل لاء ياد رکو ۽ مسلسل پنهنجو پاڻ کي چيڪ ڪريو. جيڪڏھن توھان چاھيو ٿا ته اھو ڪيو وڃيrun()، ان کي سڏيوstart(). اچو ته اڳتي وڌون.

Thread.sleep() طريقو

موجوده سلسلي جي عمل کي ڪجهه وقت لاءِ روڪڻ لاءِ، استعمال ڪريو sleep(). ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا طريقا ڇا ڪن ٿا - 3اهو طريقو sleep()مليس سيڪنڊن جي تعداد کي پيٽرولر جي طور تي وٺندو آهي، اهو آهي، اهو وقت جنهن لاء موضوع کي سمهڻ جي ضرورت آهي.
public class Main {

   public static void main(String[] args) throws InterruptedException {

       long start = System.currentTimeMillis();

       Thread.sleep(3000);

       System.out.println(" - Сколько я проспал? \n - " + ((System.currentTimeMillis()-start)) / 1000 + " секунды");

   }
}
ڪنسول آئوٽ: - مان ڪيترو وقت سمهي رهيو آهيان؟ - 3 سيڪنڊ مهرباني ڪري نوٽ ڪريو: طريقو sleep()جامد آهي: اهو موجوده موضوع کي ننڊ ۾ رکي ٿو. اهو آهي، جيڪو هن وقت ڪم ڪري رهيو آهي. ٻيو اهم nuance: ننڊ جي حالت ۾ وهڪري ۾ مداخلت ڪري سگهجي ٿو. انهي صورت ۾، هڪ استثنا پروگرام ۾ ٿيندو InterruptedException. اسان هيٺ ڏنل مثال تي نظر ڪنداسين. رستي ۾، "جاڳ" جي سلسلي کان پوء ڇا ٿيندو؟ ڇا اهو فوري طور تي ان تي عمل جاري رکندو جتان ان کي ڇڏي ويو؟ نه. ٿريڊ اٿڻ کان پوءِ-جڏھن وقت ختم ٿيڻ لاءِ دليل جي طور تي گذري ٿو- اھو هلندڙThread.sleep() حالت ۾ داخل ٿئي ٿو . جڏهن ته، هن جو مطلب اهو ناهي ته موضوع شيڊولر ان کي هلائي سگهندو. اهو بلڪل ممڪن آهي ته اهو ڪنهن ٻئي ”بي ننڊ“ ٿريڊ کي ترجيح ڏيندو ۽ اسان جو ”تازو بيدار“ ٿريڊ ٿوري دير کان پوءِ ڪم ڪندو. ياد رکڻ جي پڪ ڪريو: "جاڳڻ جو مطلب اهو ناهي ته انهي سيڪنڊ تي ڪم جاري رکو!"

Thread.join() طريقو

ملٽي ٿريڊنگ: ٿريڊ ڪلاس جا طريقا ڇا ڪن ٿا - 4اهو طريقو join()موجوده سلسلي جي عمل کي معطل ڪري ٿو جيستائين ٻيو سلسلو مڪمل نه ٿئي. جيڪڏهن اسان وٽ 2 موضوع آهن، t1۽ t2، ۽ اسين لکون ٿا -
t1.join()
t2ڪم شروع نه ڪندو جيستائين t1 پنهنجو ڪم مڪمل نه ڪري. طريقو join()سلسلن جي عمل جي تسلسل کي يقيني بڻائڻ لاء استعمال ڪري سگهجي ٿو. join()اچو ته هڪ مثال استعمال ڪندي ڪم کي ڏسو :
public class ThreadExample extends Thread {

   @Override
   public void run() {

       System.out.println("Начало работы потока " + getName());

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("Поток " + getName() +  " завершил работу.");
   }
}


public class Main {

   public static void main(String[] args) throws InterruptedException {

       ThreadExample t1 = new ThreadExample();
       ThreadExample t2 = new ThreadExample();

       t1.start();


 /*Второй поток t2 начнет выполнение только после того, How будет завершен
       (or бросит исключение) первый поток - t1*/
       try {
           t1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       t2.start();

       //Главный поток продолжит работу только после того, How t1 и t2 завершат работу
       try {
           t1.join();
           t2.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       System.out.println("Все потоки закончor работу, программа завершена");

   }
}
اسان هڪ سادي ڪلاس ٺاهيو آهي ThreadExample. ان جو ڪم اهو آهي ته اسڪرين تي ڪم جي شروعات بابت هڪ پيغام ڏيکاري، پوءِ 5 سيڪنڊن لاءِ سمهڻ ۽ آخر ۾ ڪم جي مڪمل ٿيڻ جي خبر ڏي. ڪجھ به پيچيده ناهي. بنيادي منطق ڪلاس ۾ موجود آهي Main. تبصرن کي ڏسو: طريقي سان استعمال ڪندي، join()اسان ڪاميابيء سان سلسلا جي عمل جي ترتيب کي سنڀاليندا آهيون. جيڪڏهن توهان کي موضوع جي شروعات ياد آهي، موضوع جي شيڊولر اهو ڪيو. هن انهن کي پنهنجي صوابديد تي شروع ڪيو: هر وقت مختلف. هتي، طريقو استعمال ڪندي، اسان يقين ڏياريو ته پهرين سلسلي کي لانچ ڪيو ويندو ۽ ان تي عمل ڪيو ويندو t1، پوء ٿريڊ t2، ۽ صرف انهن کان پوء پروگرام جي عمل جو مکيه سلسلو. اڳتي وڃو. حقيقي پروگرامن ۾، توهان کي اڪثر حالتن سان منهن ڏيڻو پوندو جڏهن توهان کي ڪجهه سلسلي جي عمل ۾ مداخلت ڪرڻ جي ضرورت آهي. مثال طور، اسان جو سلسلو هلي رهيو آهي، پر اهو انتظار ڪري رهيو آهي ڪنهن خاص واقعي يا حالت جي ملڻ جي. جيڪڏهن اهو ٿئي ٿو، اهو روڪي ٿو. اهو شايد منطقي هجي ها جيڪڏهن ڪو طريقو هجي ها جهڙوڪ stop(). تنهن هوندي به، سڀڪنھن شيء کي ايترو سادو نه آهي. هڪ دفعي هڪ دفعي، Thread.stop()جاوا ۾ هڪ طريقو اصل ۾ موجود هو ۽ توهان کي هڪ موضوع جي ڪم ۾ مداخلت ڪرڻ جي اجازت ڏني. پر بعد ۾ اهو جاوا لائبريري مان هٽايو ويو. توھان ان کي Oracle دستاويزن ۾ ڏسي سگھو ٿا ۽ ڏسو ته اھو نشان لڳايو ويو آھي ختم ٿيل . ڇو؟ ڇاڪاڻ ته اهو صرف بغير ڪنهن اضافي ڪم جي وهڪري کي روڪي ٿو. مثال طور، هڪ موضوع ڊيٽا سان ڪم ڪري سگهي ٿو ۽ ان ۾ ڪجهه تبديل ڪري سگهي ٿو. stop()پوءِ هن کي اوچتو ڪم جي وچ ۾ ڌڪيو ويو - ۽ اهو ئي هو. ڪو به صحيح بند نه هو، نه وسيلن جي آزاد ٿيڻ، نه ئي غلطي سنڀالڻ - هن مان ڪو به نه ٿيو. طريقو stop()، مبالغو ڪرڻ لاء، صرف ان جي رستي ۾ هر شيء کي تباهه ڪيو. ان جي آپريشن جو مقابلو ڪري سگهجي ٿو ته ڪيئن ڪو ماڻهو ڪمپيوٽر کي بند ڪرڻ لاءِ ساڪٽ مان پلگ ڪڍندو آهي. ها، توهان گهربل نتيجو حاصل ڪري سگهو ٿا. پر هرڪو سمجهي ٿو ته ڪجهه هفتن ۾ ڪمپيوٽر هن لاء "مهرباني" نه چوندا. انهي سبب لاء، جاوا ۾ موضوعن جي مداخلت لاء منطق تبديل ٿي وئي، ۽ هاڻي هڪ خاص طريقو استعمال ڪيو ويو آهي - interrupt().

Thread.interrupt() طريقو

ڇا ٿيندو جيڪڏھن توھان ھڪڙي طريقي کي interrupt() ھڪڙي موضوع تي سڏين ٿا ؟ اتي 2 آپشن آهن:
  1. جيڪڏهن اعتراض ان وقت انتظار جي حالت ۾ هو، مثال طور، joinيا sleep، انتظار ۾ مداخلت ڪئي ويندي ۽ پروگرام اڇلائي ڇڏيندو InterruptedException.
  2. جيڪڏهن ڌاڳو ان وقت ڪم ڪندڙ حالت ۾ هو، اعتراض جو بولان پرچم مقرر ڪيو ويندو interrupted.
پر اسان کي هن پرچم جي قيمت لاءِ اعتراض کي جانچڻو پوندو ۽ پنهنجو ڪم صحيح طريقي سان پورو ڪرڻو پوندو! هن مقصد لاء، طبقي کي Threadهڪ خاص طريقو آهي - boolean isInterrupted(). اچو ته مکيه ڪورس ليڪچر مان گھڙي مثال ڏانھن واپس وڃو. سهولت لاء، اهو ٿورڙو آسان آهي:
public class Clock extends Thread {

   public static void main(String[] args) throws InterruptedException {
       Clock clock = new Clock();
       clock.start();

       Thread.sleep(10000);
       clock.interrupt();
   }

   public void run() {
       Thread current = Thread.currentThread();

       while (!current.isInterrupted())
       {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               System.out.println("Работа потока была прервана");
               break;
           }
           System.out.println("Tik");
       }
   }
}
اسان جي حالت ۾، ڪلاڪ شروع ٿئي ٿو ۽ هر سيڪنڊ کي ٽڪڻ شروع ٿئي ٿو. 10 هين سيڪنڊ تي اسان ڪلاڪ جي وهڪري کي روڪيو. جيئن ته توهان اڳ ۾ ئي ڄاڻو ٿا، جيڪڏهن موضوع جنهن ۾ اسان مداخلت ڪرڻ جي ڪوشش ڪري رهيا آهيون انتظار جي رياستن مان هڪ آهي، اهو نتيجو آهي InterruptedException. هن قسم جي استثنا هڪ ​​چيڪ ٿيل استثنا آهي، تنهنڪري اهو آساني سان پڪڙي سگهجي ٿو ۽ اسان جي پروگرام جي ختم ٿيڻ واري منطق تي عمل ڪيو ويو آهي. اهو ئي اسان ڪيو. ھي آھي اسان جو نتيجو: ٽڪ ٽِڪ ٽڪ ٽِڪ ٽڪ ٽِڪ ٽڪ ٽِڪ ٽڪ ٽِڪ ٽڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٽِڪ ٿريڊ جي ڪم ۾ خلل پئجي ويو Thread. پنهنجي علم کي مضبوط ڪرڻ لاءِ، توهان ڏسي سگهو ٿا هي وڊيو ليڪچر ملٽي ٿريڊنگ بابت:
اهو بهترين اضافي مواد طور ڪم ڪندو! آخر ۾، طريقن جي هڪ جائزو کان پوء، اهو ٻڌائي ٿو ته اسان اڳتي هلي ڪورس ۾ ڇا ڪنداسين :) سٺي قسمت!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION