Thread of Execution: चूंकि हम नया Thread Create करने के लिए .NET के Thread Class का ही Object Create करते हैं। इसलिए यदि हम चाहें तो Current Thread के Reference को भी Thread Class के Object में Store कर सकते हैं और Thread Class के विभिन्न Properties व Methods को Current Thread Object के लिए Use करके Current Thread से सम्बंधित विभिन्न प्रकार की जरूरी जानकारियां प्राप्त कर सकते हैं। जैसे:
File Name: CurrentThreadBasicInformation.cs
using System;
using System.Threading;
namespace CSharpMultiThreading
{
class ThreadBasics
{
static void Main(string[] args)
{
// Obtain and name the current thread.
Thread primaryThread = Thread.CurrentThread;
primaryThread.Name = "ThePrimaryThread";
// Show details of hosting AppDomain/Context.
Console.WriteLine("Name of current AppDomain: {0}",Thread.GetDomain().FriendlyName);
Console.WriteLine("ID of current Context: {0}", Thread.CurrentContext.ContextID);
// Print out some stats about this thread.
Console.WriteLine("Thread Name: {0}", primaryThread.Name);
Console.WriteLine("Has thread started?: {0}", primaryThread.IsAlive);
Console.WriteLine("Priority Level: {0}", primaryThread.Priority);
Console.WriteLine("Thread State: {0}", primaryThread.ThreadState);
}
}
}
// Output:
Name of current AppDomain:
CurrentThreadBasicInformation.exe
ID of current Context: 0
Thread Name: ThePrimaryThread
Has thread started?: True
Priority Level: Normal
Thread State: Running
इस Program में हमने सबसे पहले Current Thread का Reference Retrieve करने के लिए निम्नानुसार तरीके से Thread Class का एक Reference Variable Create किया है और उसे Current Program के Thread के Reference से Initialize किया है जो कि हमेंशा Primary Thread होता है:
Thread primaryThread = Thread.CurrentThread;
फिर हमने हमारे Thread Reference Variable का नाम Set करने के लिए निम्नानुसार तरीके से Name Property को Use किया है:
primaryThread.Name = “ThePrimaryThread”;
और अपने Current Program के Thread का नाम “ThePrimaryThread” Set कर दिया है। फिर निम्न Statement Execute किया है:
Console.WriteLine(“Name of current AppDomain: {0}”,Thread.GetDomain().FriendlyName);
जहां अपने Application File के नाम को Display करने के लिए हमने Thread.GetDomain() .FriendlyName Statement को Use किया है। फिर निम्न Statement द्वारा Current Thread के Context को Retrieve किया है:
Console.WriteLine(“ID of current Context: {0}”, Thread.CurrentContext.ContextID);
चूंकि Main() Thread हमेंशा Process का पहला Thread होता है, इसलिए इसका Context ID हमेंशा 0 होता है। इसीलिए Output में हमें हमारे Current Program का Context ID 0 प्राप्त हो रहा है। फिर हमने निम्न Statement द्वारा अपने Current Thread का नाम Retrieve किया है:
Console.WriteLine(“Thread Name: {0}”, primaryThread.Name);
और जैसाकि हम Output में देख सकते हैं कि इस Statement के Execute होने पर हमें वही नाम प्राप्त होता है, जो हमने निम्नानुसार Statement द्वारा Set किया था:
primaryThread.Name = “ThePrimaryThread”;
इस Statement के Execution के बाद निम्नानुसार तीन Statements Execute होते हैं
Console.WriteLine(“Has thread started?: {0}”, primaryThread.IsAlive);
Console.WriteLine(“Priority Level: {0}”, primaryThread.Priority);
Console.WriteLine(“Thread State: {0}”, primaryThread.ThreadState);
जहां पहला Statement इस बात को Indicate करता है कि Current Thread Currently Live है या नहीं। जबकि दूसरा Statement Current Thread की Priority Return करता है, जो कि सामान्यत: सभी Newly Created Threads की Default Priority “Normal” ही होती है और अन्तिम Statement द्वारा हम इस बात का पता लगाते हैं कि Current Thread वर्तमान में किस State में है।
जिस तरह से हमने Current Thead के लिए इन Properties को Use किया है, उसी तरह से हम किसी Program के किसी भी Thread Object के साथ इन Properties को Use कर सकते हैं। इनके अलावा Thread Class में और भी बहुत सारी Properties व Methods Define किया गया है, जिन्हें हम हमारी जरूरत के अनुसार किसी भी Thread Object के लिए Use कर सकते हैं।
Name Property
Name Property का प्रयोग करके हम किसी Thread का नाम Set कर सकते हैं। ताकि यदि किसी Program में एक से ज्यादा Threads हों, तो हम उन्हें उनके नाम से Identify कर सकें।
साथ ही जब हम Visual Studio IDE का प्रयोग करते हुए Multi-Threaded Program Create करते हैं, तब हम हमारे विभिन्न Threads को जो नाम देते हैं, वे नाम हमें उस स्थिति में Debug => Windows => Threads Option में दिखाई देते हैं, जब हम हमारे Application को F5 Function Key द्वारा Debug Mode में Run करते हैं।
Priority Property
जैसाकि हमने पहले भी कहा कि जब भी कोई नया Thread Create होता है, Operating System द्वारा उसे Default रूप से “Normal” Priority Assign कर दिया जाता है। लेकिन यदि हम चाहें तो Thread के Lifetime के दौरान किसी भी समय इस Priority को System.Threading .ThreadPriority Enumeration का प्रयोग करके Change कर सकते हैं। ये Enumeration कुछ निम्नानुसार Define किया गया है:
public enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }
यदि हम किसी Thread को Default Value के अलावा अन्य कोई Value Set करते हैं, तो भी हमारा उस Thread की Priority पर कोई Control नहीं होता। क्योंकि जब Thread Scheduler विभिन्न Threads के बीच Switching करता है, तो वही CLR से इस बात की Information प्राप्त करता है कि Thread Activity की Importance के आधार पर किस Thread को कब Execute होने के लिए Schedule करना है।
जबकि हम इन Thread Priority Values को Set करके केवल CLR से एक Request करते हैं कि यदि उसे उपयुक्त लगे, तो वह हमारे किसी Specified Thread की Priority को हमारे द्वारा Specified Value के अनुसार High या Low Priority के साथ Treat करे।
यानी यदि हम किसी Thread को ThreadPriority.Highest Set कर दें, तो इसका मतलब ये नहीं है कि वही Thread सबसे पहले Execute होगा। वैसे सामान्य स्थिति में हमें कभी-कभार ही किसी Thread की Priority को Manually Alter करने की जरूरत पडती है।
Thread की Priority Set करके हम सामान्यत: ये तय करते हैं कि किसी Thread को CPU का कितना समय प्राप्त होगा। जिस Thread की Priority ज्यादा होती है, उसे ज्यादा CPU Time प्राप्त होता है जबकि कम Priority वाले Thread को कम CPU Time मिलता है।
लेकिन किस Thread को कितना CPU Time मिलेगा इस बात को पूरी तरह से CLR ही तय करता है। क्योंकि Thread की Priority के अलावा भी कई और Factors होते हैं, जिन्हें उपयोग में लेते हुए ही CLR विभिन्न Threads को Execute होने के लिए CPU Time Allot करता है।
उदाहरण के लिए यदि कोई High Priority Thread भी User Input प्राप्त करने के लिए Wait कर रहा है, तो CLR उस High Priority Thread को भी Blocked रखेगा और किसी Low Priority Thread को भी अधिक CPU Time Provide कर देगा। इसलिए हम कभी भी किसी भी तरीके से ये तय नहीं कर सकते हैं कि कौनसा Thread CPU पर ज्यादा Time प्राप्त करेगा और कौनसा कम।
जब भी कोई Secondary Thread Start होता है, वह Default Priority ही प्राप्त करता है। हालांकि उस Thread को ThreadPriority Property द्वारा High या Low Priority के लिए Get/Set किया जा सकता है, जिसका Syntax निम्नानुसार होता है:
public ThreadPriority Priority{ get; set; }
जैसाकि हमने पहले बताया कि ThreadPriority एक Enum Type है जिसमें निम्नानुसार पांच Priority Constants हैं:
ThreadPriority.Highest ThreadPriority.AboveNormal ThreadPriority.Normal //Default Priority ThreadPriority.BelowNormal ThreadPriority.Lowest
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C#.NET in Hindi | Page:908 | Format: PDF
