Thread in computer science means a sequence of execution instructions that can run independently , that is a single flow of execution in a process. Thread is like a process, at least one thread exists within each process. Single Thread (normal programs) in computer science means that only one task can execute and at the same time the other tasks have to wait for the completion of the current task like in a queue. Single thread resulted in systems idle time and application performance.
In .Net, the threading is handled through the 'System.Threading' namespace. Creating a variable of the System.Threading.Thread type allows you to create a new thread to start working with. It allows you to create and access individual threads in a program.Creating Thread A thread is created by creating a Thread object, giving its constructor a ThreadStart reference.
ThreadStart childthreat = new ThreadStart(childthreadcall);
A simple classic thread Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThreadStart = new ThreadStart(new Program().testThread);
Thread testThread = new Thread(testThreadStart);
testThread.Start();
Console.ReadLine();
}
public void testThread()
{
//executing in thread
int count = 0;
while (count++ < 50)
{
Console.WriteLine("Thread Executed "+count+" times");
Thread.Sleep(500);
}
}
}
}
Output:
Multithreading allows multiple process to execute concurrently within a single program .That is more than one task in a program can execute at the same
time and each thread run independently of its own. If multiple threads can exist within a process, typically share the state information of a process, and
share memory and other resources directly. Each thread maintains exception handlers, a scheduling priority, and a set of structures the system uses to
save the thread context until it is scheduled.
Multithreaded Programming With Classic Threads:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThread1Start = new ThreadStart(new Program().testThread1);
ThreadStart testThread2Start = new ThreadStart(new Program().testThread2);
Thread[] testThread = new Thread[2];
testThread[0] = new Thread(testThread1Start);
testThread[1] = new Thread(testThread2Start);
foreach (Thread myThread in testThread)
{
myThread.Start();
}
Console.ReadLine();
}
public void testThread1()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed "+count+" times");
Thread.Sleep(1);
}
}
public void testThread2()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(1);
}
}
}
}
Output:
Working With ThreadPool: So, as we have seen so far in above code examples, uses ‘Thread’ in raw mode. However, we can simplify the thread running process with use of ‘ThreadPool’ class that is provided by .NET framework and is very much helpful for quick implementation of multithreaded programming. All we have to do is to queue the function we want running in thread. And it will automatically start executing them. The following code will demonstrate this simplified usage of ‘ThreadPool’ .
For Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new Program().testThread1);
ThreadPool.QueueUserWorkItem(new Program().testThread2);
Console.ReadLine();
}
public void testThread1(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed " + count + " times");
Thread.Sleep(100);
}
}
public void testThread2(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(100);
}
}
}
}
Output:
Thread Life Cycle:
The life cycle of a thread starts when an object of the System.Threading.Thread class is created and ends when the thread is terminated or completes execution.
Life cycle of a thread: The Unstarted State : It is the situation when the instance of the thread is created but the Start method is not called. The Ready State : It is the situation when the thread is ready to execute and waiting CPU cycle. The Not Runnable State : a thread is not runnable, when:
Sleep method has been called
Wait method has been called
Blocked by I/O operations
The Dead State : It is the situation when the thread has completed execution or has been aborted.Thread Priority The Priority property of the Thread class specifies the priority of one thread with respect to other. The .Net runtime selects the ready thread with the highest priority.The priorities could be categorized as:
Above normal
Below normal
Highest
Lowest
Normal
Once a thread is created, its priority is set using the Priority property of the thread class.
NewThread.Priority = ThreadPriority.Lowest;
In .Net, the threading is handled through the 'System.Threading' namespace. Creating a variable of the System.Threading.Thread type allows you to create a new thread to start working with. It allows you to create and access individual threads in a program.Creating Thread A thread is created by creating a Thread object, giving its constructor a ThreadStart reference.
ThreadStart childthreat = new ThreadStart(childthreadcall);
A simple classic thread Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThreadStart = new ThreadStart(new Program().testThread);
Thread testThread = new Thread(testThreadStart);
testThread.Start();
Console.ReadLine();
}
public void testThread()
{
//executing in thread
int count = 0;
while (count++ < 50)
{
Console.WriteLine("Thread Executed "+count+" times");
Thread.Sleep(500);
}
}
}
}
Output:
Multithreading allows multiple process to execute concurrently within a single program .That is more than one task in a program can execute at the same
time and each thread run independently of its own. If multiple threads can exist within a process, typically share the state information of a process, and
share memory and other resources directly. Each thread maintains exception handlers, a scheduling priority, and a set of structures the system uses to
save the thread context until it is scheduled.
Multithreaded Programming With Classic Threads:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadStart testThread1Start = new ThreadStart(new Program().testThread1);
ThreadStart testThread2Start = new ThreadStart(new Program().testThread2);
Thread[] testThread = new Thread[2];
testThread[0] = new Thread(testThread1Start);
testThread[1] = new Thread(testThread2Start);
foreach (Thread myThread in testThread)
{
myThread.Start();
}
Console.ReadLine();
}
public void testThread1()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed "+count+" times");
Thread.Sleep(1);
}
}
public void testThread2()
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(1);
}
}
}
}
Output:
Working With ThreadPool: So, as we have seen so far in above code examples, uses ‘Thread’ in raw mode. However, we can simplify the thread running process with use of ‘ThreadPool’ class that is provided by .NET framework and is very much helpful for quick implementation of multithreaded programming. All we have to do is to queue the function we want running in thread. And it will automatically start executing them. The following code will demonstrate this simplified usage of ‘ThreadPool’ .
For Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new Program().testThread1);
ThreadPool.QueueUserWorkItem(new Program().testThread2);
Console.ReadLine();
}
public void testThread1(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 1 Executed " + count + " times");
Thread.Sleep(100);
}
}
public void testThread2(Object threadContext)
{
//executing in thread
int count = 0;
while (count++ < 10)
{
Console.WriteLine("Thread 2 Executed " + count + " times");
Thread.Sleep(100);
}
}
}
}
Output:
Thread Life Cycle:
The life cycle of a thread starts when an object of the System.Threading.Thread class is created and ends when the thread is terminated or completes execution.
Life cycle of a thread: The Unstarted State : It is the situation when the instance of the thread is created but the Start method is not called. The Ready State : It is the situation when the thread is ready to execute and waiting CPU cycle. The Not Runnable State : a thread is not runnable, when:
Sleep method has been called
Wait method has been called
Blocked by I/O operations
The Dead State : It is the situation when the thread has completed execution or has been aborted.Thread Priority The Priority property of the Thread class specifies the priority of one thread with respect to other. The .Net runtime selects the ready thread with the highest priority.The priorities could be categorized as:
Above normal
Below normal
Highest
Lowest
Normal
Once a thread is created, its priority is set using the Priority property of the thread class.
NewThread.Priority = ThreadPriority.Lowest;