CodeGym /جاوا بلاگ /Random-SD /گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس. حصو I - عملدرآمد جا سلسلا
John Squirrels
سطح
San Francisco

گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس. حصو I - عملدرآمد جا سلسلا

گروپ ۾ شايع ٿيل

تعارف

ملٽي ٿريڊنگ شروع کان ئي جاوا ۾ ٺهيل هئي. سو اچو ته مختصر طور تي ان شيءِ تي نظر وجهون جنهن کي ملٽي ٿريڊنگ چئجي ٿو. گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس.  حصو 1 - عملدرآمد جا موضوع - 1اسان Oracle کان سرڪاري سبق هڪ حوالن جي طور تي وٺون ٿا: " سبق: "هيلو ورلڊ!" ايپليڪيشن ". اسان پنهنجي هيلو ورلڊ پروگرام جي ڪوڊ کي هن ريت تبديل ڪنداسين:
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello, " + args[0]);
    }
}
argsپروگرام شروع ٿيڻ تي پاس ٿيل ان پٽ پيٽرولر جو هڪ صف آهي. ھن ڪوڊ کي ھڪڙي نالي سان فائل ۾ محفوظ ڪريو جيڪو ڪلاس جي نالي سان ملندو آھي ۽ ان ۾ واڌارو آھي .java. javac استعمال ڪندي ان کي گڏ ڪريو : javac HelloWorldApp.java. ان کان پوء، اسان اسان جي ڪوڊ کي ڪجهه پيٽرولر سان هلائيندا آهيون، مثال طور، "Roger": java HelloWorldApp Roger گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس.  حصو I - عملدرآمد جا موضوع - 2اسان جي ڪوڊ ۾ هن وقت هڪ سنگين نقص آهي. جيڪڏهن توهان ڪو به دليل نه پاس ڪيو (يعني صرف "java HelloWorldApp" تي عمل ڪريو)، پوء اسان کي هڪ غلطي ملي ٿي:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at HelloWorldApp.main(HelloWorldApp.java:3)
هڪ استثنا (يعني هڪ غلطي) "مئن" نالي سلسلي ۾ پيش آئي. تنهن ڪري، جاوا موضوع آهن؟ هتي اسان جو سفر شروع ٿئي ٿو.

جاوا ۽ سلسلا

سمجھڻ لاءِ ٿريڊ ڇا آھي، توھان کي سمجھڻ گھرجي ته جاوا پروگرام ڪيئن شروع ٿئي ٿو. اچو ته اسان جو ڪوڊ هن ريت تبديل ڪريون:
class HelloWorldApp {
    public static void main(String[] args) {
		while (true) {
			// Do nothing
		}
	}
}
هاڻي اچو ته ان کي ٻيهر گڏ ڪريون javac. سهولت لاءِ، اسان پنهنجي جاوا ڪوڊ کي الڳ ونڊو ۾ هلائينداسين. ونڊوز تي، اهو هن طرح ڪري سگهجي ٿو: start java HelloWorldApp. ھاڻي اسان استعمال ڪنداسين jps يوٽيليٽي کي ڏسڻ لاءِ ته جاوا اسان کي ڪھڙي معلومات ٻڌائي سگھي ٿو: گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس.  حصو 1 - عملدرآمد جا موضوع - 3پھريون نمبر PID يا پروسيس ID آھي. هڪ عمل ڇا آهي؟
A process is a combination of code and data sharing a common virtual address space.
عملن سان، مختلف پروگرامن کي هڪ ٻئي کان الڳ ڪيو ويندو آهي جيئن اهي هلن ٿا: هر ايپليڪيشن ٻين پروگرامن سان مداخلت ڪرڻ کان سواءِ ميموري ۾ پنهنجو علائقو استعمال ڪري ٿي. وڌيڪ سکڻ لاءِ، مان هي سبق پڙهڻ جي صلاح ڏيان ٿو: Processes and Threads . ٿريڊ کان سواءِ ڪو عمل موجود نه ٿو رهي سگهي، تنهنڪري جيڪڏهن ڪو عمل موجود آهي ته پوءِ ان ۾ گهٽ ۾ گهٽ هڪ ڌاڳو هوندو. پر اهو ڪيئن اچي ٿو جاوا ۾؟ جڏهن اسان هڪ جاوا پروگرام شروع ڪندا آهيون، عملدرآمد mainطريقي سان شروع ٿئي ٿو. اهو ڄڻ ته اسان پروگرام ۾ قدم رکي رهيا آهيون، تنهنڪري هن خاص mainطريقي کي سڏيو ويندو آهي داخلا پوائنٽ. طريقو mainهميشه "عوامي جامد باطل" هجڻ گهرجي، انهي ڪري ته جاوا ورچوئل مشين (JVM) اسان جي پروگرام تي عمل ڪرڻ شروع ڪري سگهي ٿي. وڌيڪ معلومات لاءِ، جاوا مکيه طريقو جامد ڇو آهي؟ . اهو ظاهر ٿئي ٿو ته جاوا لانچر (java.exe يا javaw.exe) هڪ سادي سي ايپليڪيشن آهي: اهو مختلف ڊي ايل ايل لوڊ ڪري ٿو جيڪي اصل ۾ JVM تي مشتمل آهن. جاوا لانچر Java Native Interface (JNI) ڪالن جو هڪ مخصوص سيٽ ٺاهي ٿو. JNI جاوا ورچوئل مشين جي دنيا کي C++ جي دنيا سان ڳنڍڻ جو هڪ طريقو آهي. تنهن ڪري، لانچر خود JVM نه آهي، بلڪه ان کي لوڊ ڪرڻ لاء هڪ ميڪانيزم. اهو ڄاڻي ٿو صحيح حڪمن تي عمل ڪرڻ لاءِ JVM شروع ڪرڻ لاءِ. اهو ڄاڻي ٿو ته ڪيئن استعمال ڪجي JNI ڪالون ضروري ماحول قائم ڪرڻ لاءِ. هن ماحول کي ترتيب ڏيڻ ۾ مکيه موضوع ٺاهڻ شامل آهي، جنهن کي "مکيه" سڏيو ويندو آهي، يقينا. بهتر واضع ڪرڻ لاءِ ته جاوا جي عمل ۾ ڪهڙا سلسلا موجود آهن، اسان استعمال ڪريون ٿا jvisualvm اوزار، جيڪو JDK سان شامل آهي. ڪنهن پروسيس جي پِڊ کي ڄاڻڻ سان، اسان ان عمل جي باري ۾ معلومات فوري طور تي ڏسي سگهون ٿا: jvisualvm --openpid <process id> گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس.  حصو I - عملدرآمد جا موضوع - 4دلچسپ ڳالهه اها آهي ته، هر ٿريڊ کي پروسيس لاءِ مختص ڪيل ياداشت ۾ پنهنجو الڳ علائقو هوندو آهي. هن ياداشت جي جوڙجڪ کي اسٽيڪ سڏيو ويندو آهي. هڪ اسٽيڪ فريم تي مشتمل آهي. ھڪڙو فريم ھڪڙي طريقي جي چالو ڪرڻ جي نمائندگي ڪري ٿو (ھڪ نامڪمل طريقو ڪال). ھڪڙي فريم کي StackTraceElement طور پڻ پيش ڪري سگھجي ٿو (ڏسو جاوا API لاءِ StackTraceElement ). توھان وڌيڪ معلومات حاصل ڪري سگھوٿا ميموري بابت ھر سلسلي ۾ مختص ڪيل ميموري بابت هتي بحث ۾: " How does Java (JVM) allocate stack for each thread ". جيڪڏھن توھان جاوا API کي ڏسو ۽ لفظ "Thread" ڳولھيو، توھان کي java.lang.Thread ڪلاس ملندو. هي اهو طبقو آهي جيڪو جاوا ۾ هڪ سلسلي جي نمائندگي ڪري ٿو، ۽ اسان کي ان سان ڪم ڪرڻو پوندو. گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس.  حصو I - عملدرآمد جا موضوع - 5

java.lang.Thread

جاوا ۾، هڪ ڌاڳو java.lang.Threadڪلاس جي هڪ مثال جي نمائندگي ڪري ٿو. توھان کي فوري طور تي سمجھڻ گھرجي ته ٿريڊ ڪلاس جا مثال پاڻ تي عملدرآمد جا سلسلا نه آھن. هي صرف JVM ۽ آپريٽنگ سسٽم پاران منظم ڪيل هيٺين سطح جي سلسلي لاءِ API جو هڪ قسم آهي. جڏهن اسان جاوا لانچر استعمال ڪندي JVM شروع ڪريون ٿا، اهو هڪ mainٿريڊ ٺاهي ٿو جنهن کي "مئن" سڏيو ويندو آهي ۽ ڪجهه ٻيا گهر سنڀالڻ وارا موضوع. جيئن ته JavaDoc ۾ ٿريڊ ڪلاس لاءِ بيان ڪيو ويو آهي: When a Java Virtual Machine starts up, there is usually a single non-daemon thread. ٿريڊ جا 2 قسم آهن: ڊيمون ۽ غير ڊيمون. ڊيمون ٿريڊس پس منظر (گھر سنڀالڻ) ٿريڊ آھن جيڪي پس منظر ۾ ڪجھ ڪم ڪن ٿا. لفظ "ڊيمون" ميڪسويل جي شيطان ڏانهن اشارو ڪري ٿو. توھان ھن وڪيپيڊيا مضمون ۾ وڌيڪ ڄاڻو ٿا . جيئن ته دستاويز ۾ بيان ڪيو ويو آهي، JVM پروگرام (عمل) تي عمل جاري رکي ٿو جيستائين:
  • Runtime.exit () طريقو سڏيو ويندو آهي
  • سڀ غير ڊيمون ٿريڊ پنهنجو ڪم ختم ڪن ٿا (بغير غلطيون يا اڇلايل استثنا سان)
هن مان هڪ اهم تفصيل هيٺ ڏنل آهي: ڊيمون موضوعن کي ڪنهن به نقطي تي ختم ڪري سگهجي ٿو. نتيجي طور، انهن جي ڊيٽا جي سالميت بابت ڪا به ضمانت نه آهي. ان جي مطابق، ڊيمن جا سلسلا ڪجهه گهرن جي ڪمن لاء مناسب آهن. مثال طور، جاوا وٽ ھڪڙو ٿريڊ آھي جيڪو پروسيسنگ finalize()ميٿڊ ڪالز لاءِ ذميوار آھي، يعني ٿريڊز شامل آھن گاربيج ڪليڪٽر (gc) سان. هر موضوع هڪ گروپ جو حصو آهي ( ThreadGroup ). ۽ گروهه ٻين گروهن جو حصو ٿي سگهي ٿو، هڪ خاص درجه بندي يا جوڙجڪ ٺاهيندي.
public static void main(String[] args) {
	Thread currentThread = Thread.currentThread();
	ThreadGroup threadGroup = currentThread.getThreadGroup();
	System.out.println("Thread: " + currentThread.getName());
	System.out.println("Thread Group: " + threadGroup.getName());
	System.out.println("Parent Group: " + threadGroup.getParent().getName());
}
گروپن کي ترتيب ڏيڻ جي سلسلي ۾ انتظام. گروپن کان علاوه، موضوعن جو پنهنجو استثنا هينڊلر آهي. هڪ مثال ڏسو:
public static void main(String[] args) {
	Thread th = Thread.currentThread();
	th.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
		@Override
		public void uncaughtException(Thread t, Throwable e) {
			System.out.println("An error occurred: " + e.getMessage());
		}
	});
    System.out.println(2/0);
}
صفر طرفان ڊويزن هڪ غلطي جو سبب بڻجندو جيڪو سنڀاليندڙ طرفان پڪڙيو ويندو. جيڪڏهن توهان پنهنجي هينڊلر جي وضاحت نه ڪندا آهيو، ته پوءِ JVM ڊفالٽ هينڊلر کي سڏيندو، جيڪو استثنيٰ جي اسٽيڪ ٽريس کي StdError ڏانهن آڻيندو. هر سلسلي کي به هڪ ترجيح آهي. توھان ھن مضمون ۾ ترجيحن بابت وڌيڪ پڙھي سگھو ٿا: جاوا سلسلي جي ترجيح ملٽي ٿريڊنگ ۾ .

تار ٺاهڻ

جيئن ته دستاويز ۾ بيان ڪيو ويو آهي، اسان وٽ 2 طريقا آهن هڪ موضوع ٺاهڻ لاء. پهريون طريقو توهان جي پنهنجي ذيلي ڪلاس ٺاهڻ لاء آهي. مثال طور:
public class HelloWorld{
    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Hello, World!");
        }
    }

    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
    }
}
جئين توهان ڏسي سگهو ٿا، ڪم جو ڪم طريقي سان ٿئي ٿو run()، پر ڌاڳو پاڻ start()طريقي سان شروع ٿئي ٿو. انهن طريقن کي غلط نه ڪريو: جيڪڏهن اسان un()سڌو طريقي سان سڏين ٿا، پوء ڪو به نئون سلسلو شروع نه ٿيندو. اهو start()طريقو آهي جيڪو JVM کان پڇي ٿو هڪ نئون موضوع ٺاهي. هي اختيار جتي اسان ٿريڊ کي ورثي ۾ آڻيون ٿا اڳ ۾ ئي خراب آهي ان ڪري اسان ٿريڊ کي پنهنجي ڪلاس هيرارڪي ۾ شامل ڪريون ٿا. ٻيو نقصان اهو آهي ته اسان "اڪيلو ذميواري" اصول جي ڀڃڪڙي ڪرڻ شروع ڪري رهيا آهيون. يعني اسان جو طبقو هڪ ئي وقت ان سلسلي کي سنڀالڻ ۽ ان سلسلي ۾ ڪجهه ڪم ڪرڻ جو ذميوار آهي. صحيح رستو ڇا آهي؟ جواب ساڳئي run()طريقي سان ملي ٿو، جنهن کي اسين مٿي ڪريون ٿا:
public void run() {
	if (target != null) {
		target.run();
	}
}
هتي، targetڪجهه آهي java.lang.Runnable، جنهن کي اسين پاس ڪري سگهون ٿا جڏهن ٿريڊ ڪلاس جو مثال ٺاهي سگهون ٿا. هن جو مطلب آهي ته اسان اهو ڪري سگهون ٿا:
public class HelloWorld{
    public static void main(String[] args) {
        Runnable task = new Runnable() {
            public void run() {
                System.out.println("Hello, World!");
            }
        };
        Thread thread = new Thread(task);
        thread.start();
    }
}
Runnableجاوا 1.8 کان وٺي هڪ فنڪشنل انٽرفيس پڻ آهي. اهو هڪ موضوع جي ڪم لاء اڃا به وڌيڪ خوبصورت ڪوڊ لکڻ ممڪن بڻائي ٿو:
public static void main(String[] args) {
	Runnable task = () -> {
		System.out.println("Hello, World!");
	};
	Thread thread = new Thread(task);
	thread.start();
}

نتيجو

اميد اٿم ته هي بحث واضح ڪندو ته ٿريڊ ڇا آهي، ٿريڊ ڪيئن وجود ۾ اچن ٿا، ۽ ٿريڊز سان ڪهڙا بنيادي ڪم ڪري سگهجن ٿا. ايندڙ حصي ۾ ، اسان اهو سمجهڻ جي ڪوشش ڪنداسين ته موضوع ڪيئن هڪ ٻئي سان لهه وچڙ ۾ اچن ٿا ۽ موضوع جي زندگي جي چڪر کي ڳوليندا. گڏو گڏ بهتر: جاوا ۽ ٿريڊ ڪلاس. حصو II - هم وقت سازي بهتر گڏجي: جاوا ۽ ٿريڊ ڪلاس. حصو III - رابطي بهتر گڏجي: جاوا ۽ ٿريڊ ڪلاس. حصو IV — سڏڻ لائق، مستقبل، ۽ دوست گڏ ڪري بهتر: جاوا ۽ ٿريڊ ڪلاس. حصو V - ايگزيڪيوٽر، ٿريڊ پول، فورڪ / شامل ٿيڻ بهتر گڏجي: جاوا ۽ ٿريڊ ڪلاس. حصو VI - فائر پري!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION