In a multithreaded environment, each thread has a priority that influences how the thread is scheduled for CPU execution by the operating system. The Thread.Priority property in C# is used to set or get the priority of a thread.
- Explicit Control: Developers can manually set or retrieve a thread's priority using the Priority property.
- Default State: Every new thread inherits the priority of the creating thread (which is typically Normal) unless changed.
- OS Influence: While the Operating System manages scheduling, priorities act as a "hint" to favor certain threads.
- Thread Starvation: Setting priorities too high for some threads can "starve" lower-priority ones, preventing them from running.
- No Execution Guarantee: High priority doesn't guarantee a thread will finish first; OS context switching still applies.
- Process Dependency: A thread's actual power is limited by the priority of its parent Process.
Thread Priority Levels
The ThreadPriority enum under the System.Threading namespace specifies the following priority levels:
Priority Level | Description | Value |
|---|---|---|
Highest | Highest priority for a thread. | 4 |
AboveNormal | Higher than Normal priority. | 3 |
Normal (Default) | Default priority. | 2 |
BelowNormal | Lower than Normal priority. | 1 |
Lowest | Lowest priority for a thread. | 0 |
Syntax:
public ThreadPriority Priority{ get; set; }
Exceptions:
- ThreadStateException:Â If the thread has reached a final state, such as Aborted.
- ArgumentException:Â If the value specified for a set operation is not a valid ThreadPriority value.
Example 1: This example demonstrates how to set and get the priority of threads.
using System;
using System.Threading;
class Geeks
{
static public void Main()
{
// Creating and initializing threads
Thread T1 = new Thread(work);
Thread T2 = new Thread(work);
Thread T3 = new Thread(work);
// Set the priority of threads
T2.Priority = ThreadPriority.Highest;
T3.Priority = ThreadPriority.BelowNormal;
T1.Start();
T2.Start();
T3.Start();
// Display the priority of threads
Console.WriteLine("The priority of T1 is: {0}",
T1.Priority);
Console.WriteLine("The priority of T2 is: {0}",
T2.Priority);
Console.WriteLine("The priority of T3 is: {0}",
T3.Priority);
}
public static void work()
{
// Sleep for 100 milliseconds
Thread.Sleep(100);
}
}
Output
The priority of T1 is: Normal The priority of T2 is: Highest The priority of T3 is: BelowNormal
Example 2: This example demonstrates how thread priority can influence thread execution.
using System;
using System.Threading;
class Geeks
{
static public void Main()
{
// Creating and initializing threads
Thread T1 = new Thread(work1);
Thread T2 = new Thread(work2);
// Set the priority of threads
// Here T2 thread executes first
// because the Priority of T2 is
// highest
T1.Priority = ThreadPriority.Lowest;
T2.Priority = ThreadPriority.Highest;
T1.Start();
T2.Start();
}
public static void work1()
{
Console.WriteLine("T1 thread is working..");
}
public static void work2()
{
Console.WriteLine("T2 thread is working..");
}
}
Output
T1 thread is working.. T2 thread is working..