Java Thread Model

Java Thread Model: जावा का Run-Time System कई चीजों के लिए Threads पर निर्भर करता है और जावा की सभी Class Libraries को Multithreading Techniques को दिमाग में रख कर Develop किया गया है। वास्तव में जावा Threads का प्रयोग पूरे जावा Environment को Synchronize करने के लिए करता है। ये प्रक्रिया CPU के Idle Time को Use करने में होने वाली Inefficiencies को कम करता है।

Single Threaded Systems में Event Loop With Polling का तरीका Use किया जाता है। इस Model में Controls का एक Single Thread एक Infinite Loop में Run होता है। Polling एक Single Event Queue होता है, जो ये तय करता है कि Next क्या करना है। एक बार जब ये Polling Mechanism किसी Signal के साथ Return होता है।

उदाहरण के लिए Network की File Ready है, इस Signal के साथ Polling Mechanism Return होता है, तब Event Loop Control को Appropriate Event Handler पर Dispatch कर देता है। जब तक ये Event Handler Return नहीं होता है, तब तक System में कोई भी दूसरा काम नहीं हो सकता है। यहीं पर CPU का Time Waste होता है। इसका हम ये परिणाम भी प्राप्त कर सकते हैं कि Program का केवल एक ही Event सारे System को Use कर रहा है और किसी अन्‍य Events को Process करने से रोक रहा है।

साधारणतौर पर किसी Single Threaded Environment में जब एक Thread किसी Resource का Wait करता है, तब वह Suspend Mode में चला जाता है और जब तक Program का वह Thread किसी Resource का Wait करता रहता है, तब तक पूरा Program Stop Mode में रहता है।

जावा के Multithreading का फायदा ये है कि इसमें Main/Polling Loop के Mechanism को Eliminate कर दिया गया है। इसमें किसी Program का एक Thread Program के किसी दूसरे Thread को Stop किए बिना किसी System Resource को प्राप्त करने के लिए Suspend Mode में Pause हो सकता है।

उदाहरण के लिए जिस समय Network से कोई File Read हो रही होती है या जिस समय Program का कोई हिस्सा User के Input का Wait कर रहा होता है, उस समय Program में किसी Image की Processing का काम या Animation के Animate होने का काम Continue रह सकता है। इस समय में भी CPU कोई ना कोई दूसरा काम करता रहता है और केवल वह Thread ही Suspend रहता है, जिसे किसी System Resource की जरूरत होती है।

एक Thread कई स्थितियों में हो सकता है। एक Thread Running Mode में हो सकता है। जैसे ही एक Thread को CPU का Time मिलता है, वह Run होने की स्थिति यानी Ready to Run हो सकता है। कोई Running Thread Suspend होकर अपनी Current Activity को कुछ समय के लिए Pause कर सकता है। एक Suspended Thread को ये बता कर कि उसे कहां फिर से अपना काम चालू करना है, वह Thread Resume हो सकता है। किसी भी समय कोई Thread Terminate हो सकता है, जिससे उस Thread का Execution तुरन्त Halt हो सकता है। एक बात ध्‍यान रखें कि एक Thread जब एक बार Terminate हो जाता है, तब वही Thread वापस Resume नहीं हो सकता।

Java Thread Model: Thread Priorities

जावा हर Thread को एक Priority प्रदान कर देता है, जिससे ये तय हो जाता है कि एक Thread दूसरे Thread की तुलना में किस प्रकार से Treat होगा। Thread Priorities Integer मान होते हैं जो Relative Thread की एक दूसरे से Priority को तय कर देते हैं। एक Absolute Value के रूप में Priority का मान Meaningless होता है। एक Higher Priority का Thread Lower Priority के Thread की तुलना में किसी भी तरह से तेज गति से Run नहीं होता है। इसके बजाय Thread Priority ये तय करता है कि किस Thread के बाद कौनसा Thread Run होगा। इस प्रक्रिया को Thread Context कहते हैं।

Java Thread Model: Thread Class and Runnable Interface

जावा का Multithreading System Thread Class, उसके MethodsRunnable Interface पर आधारित होता है। एक Thread में Execute होने वाला Sub Program Encapsulated होता है। चूंकि जावा में हम किसी भी Running Thread की स्थिति को Refer नहीं कर सकते हैं, इसलिए हमें इसके Proxy यानी Thread Class को Extend करके उसके Objects के साथ Deal करना होता है। एक नया Thread Create करने के लिए हमें Thread Class का Sub Class Create करना होता है या फिर Runnable Interface को Implement करना होता है। Thread Class में बहुत सारे Methods होते हैं, जिनका प्रयोग Threads को Manage करने के लिए किया जाता है।

Java Thread Model: The Main Thread

जब एक जावा Program Start होता है, तो तुरन्त ही एक जावा Thread Run होने लगता है। इस सबसे पहले Run होने वाले Thread को जावा में Main Thread कहते हैं, क्योंकि यही वह पहला Thread होता है, जो Program के Start होते ही Run होने लगता है। Main Thread दो कारणों की वजह से बहुत Important है:

  • यही वह Thread होता है, जिसमें अन्‍य Child Thread Swap होते हैं।
  • सामान्‍यतया यही वह अन्तिम Thread भी होता है, जो Program को Shut Down करने से सम्बंधित विभिन्न प्रकार के Finalization Tasks Perform करता है।

हालांकि जब हमारा Program Start होता है, तब ये Thread Automatically Create होता है, फिर भी इसे एक Thread Object द्वारा Control किया जा सकता है। ऐसा करने के लिए हमें इस Thread का एक Reference प्राप्त करना होता है। इस Thread का Reference प्राप्त करने के लिए हमें currentThread() Method को Call करना होता है, जो कि Thread Class का एक Public व Static Method है। इस Method का Syntax निम्नानुसार होता है:

    static Thread currentThread();

ये Method उस Thread का Reference Return करता है, जिसमें इस Method को Call किया जाता है। एक बार जब हमें Main Thread का Reference प्राप्त हो जाता है, उसके बाद हम इस Thread को भी उसी तरह से Control कर सकते हैं, जिस तरह से किसी और Thread को Control करते हैं। चलिए, इस प्रक्रिया को एक उदाहरण द्वारा समझने की कोशिश करते हैं:

// Program
// File Name : ControllingTheMainThread.java
class ControllingTheMainThread
{
	public static void main(String args[])
	{
		Thread mainThread = Thread.currentThread();
		System.out.println(“Current Thread : “ + mainThread);
	
		// Change the name of the thread
		mainThread.setName(“MyThread”);
	
		System.out.println(“After Changing the Name : “ + mainThread);
	
		try
		{
			for(int i=5; i>0; i--)
			{
				System.out.println(i);
				Thread.sleep(1000);
			}
		}
		catch(InterruptedException excp)
		{
			System.out.println(“Main Thread Interrupted”);
		}
	}
}

// Output 
   Current Thread : Thread[main,5,main]
   After Changing the Name : Thread[MyThread,5,main]
   5
   4
   3
   2
   1

इस Program में currentThread() Method को Call करके Current Thread यानी main Thread का Reference प्राप्त किया गया है और इस Reference को एक Local Thread Object mainThread में Store किया गया है। फिर Program main Thread की Information Display करता है। फिर Program main Thread के Internal नाम को Change करने के लिए setName() Method को Call करता है। फिर main Thread की Information को फिर से Display किया गया है। फिर एक Loop 5 से 1 तक गिनती Count करता है और हर Counting में sleep() Method द्वारा एक Second का समय लेता है। sleep() Method में Argument के रूप में Milliseconds में मान दिया गया है।

ध्‍यान दें कि Loop को try/catch Block में Define किया गया है, क्योंकि Thread में sleep() Method InterruptedException throw कर सकता है। ये Exception तब Throw हो सकता है, जब कोई दूसरा Thread इस Sleeping को Interrupt करना चाहता है।

इस Program में यदि कोई Exception Generate होता है, तो ये Program केवल एक Message Display करता है, जबकि किसी Real Program में हमें इस Exception को ठीक से Handle करना जरूरी होता है।

इस Program के Output में हम देख सकते हैं कि हमने Thread प्रकार के Object mainThread को println() Method में Argument के रूप में Pass किया है और जब ये Object Output में Print होता है, तब ये एक क्रम में Display होता है। ये क्रम निम्नानुसार है:

Thread [ThreadName, TreadPriority, ThreadGroupName]

By Default main Thread का नाम main है। इसकी Priority 5 है जो कि Default Value है और main उस Group का नाम है, जिसका main Thread एक सदस्; है। Thread Group एक Data Structure है, जो Threads के Collections की स्थिति को Control करता है। इस Process को जावा के Run Time Environment द्वारा Handle किया जाता है।

चलिए, इस Program में Use किए गए Methods को थोडा और समझने की कोशिश करते हैं। sleep() Method उस Thread को Argument में दिए गए Milliseconds तक के समय के लिए Suspend Mode में ले जाता है, जिसके लिए इस Method को Call किया गया है। इस Method का Syntax निम्नानुसार होता है:

static void sleep(long milliseconds) throws InterruptedException

sleep() Method का एक दूसरा रूप भी है, जो हमें Periods को MillisecondsNanoseconds में Specify करने की सुविधा देता है। इस Method का Syntax निम्नानुसार है:

static void sleep(long milliseconds, long nanoseconds) throws InterruptedException

ये Method तभी उपयोगी होता है, जब Environment Nanoseconds जितने छोटे Period को Support करता हो।

पिछले उदाहरण में हमने देखा कि हम setName() Method का प्रयोग करके Thread का नाम Set कर सकते हैं और getName() Method का प्रयोग करके Thread का नाम प्राप्त कर सकते हैं। ये Methods Thread Class के Members हैं और इस Class में इन्हें निम्नानुसार Declare किया गया है:

final void setName(String threadName)
final String getName()

यहां threadName उस Thread का नाम है, जिसका नाम बदलना है।

Java Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

Java Programming Language in Hindi | Page: 682 | Format: PDF

BUY NOW GET DEMO REVIEWS