C#为多线程编程提供了内置支持。多线程程序包含两个或多个可以同时运行的部分。此类程序的每个部分都称为一个线程,并且每个线程都定义了单独的执行路径。
主线
当C#程序启动时,一个线程立即开始运行。通常将其称为程序的主线程。
特性:
- 它是将在其下创建其他“子”线程的线程。
- 通常,它必须是完成执行的最后一个线程,因为它执行各种关闭操作。
例子:
// C# program to illustrate the working
// of main thread and child thread
using System;
using System.Threading;
public class GFG {
// Main thread
static public void Main()
{
Console.WriteLine("Welcome to the Main thread");
// Child threads
Thread thrA = new Thread(childthread);
Thread thrB = new Thread(childthread);
thrA.Start();
thrB.Start();
}
public static void childthread()
{
Console.WriteLine("Welcome to the Child thread");
}
}
输出:
Welcome to the Main thread
Welcome to the Child thread
Welcome to the Child thread
说明:上面的程序仅包含一个称为主线程的线程。主线程的工作方式与其他线程一样,但是它是自动启动的,您不需要任何Start()
方法即可开始执行主线程。 thrA和thrB都是主线程的子线程。在该子线程开始工作之后,第一个主线程开始工作。
如何访问主线程?
要访问主线程,您需要Thread类对象来引用它。您可以使用Thread类的CurrentThread属性来创建它。它将引用返回到它所使用的线程。因此,当您在主线程中使用CurrentThread属性时,您将获得主线程的引用。之后,您将像其他线程一样获得对主线程的控制。
例子:
// C# program to illustrate
// how to access main thread
using System;
using System.Threading;
public class GFG {
// Main Method
static public void Main()
{
Thread thr;
// Get the reference of main Thread
// Using CurrentThread property
thr = Thread.CurrentThread;
// Display the name of
// the main Thread
if (thr.Name == null) {
Console.WriteLine("Main thread does not have name");
}
else {
Console.WriteLine("The name of main "+
"thread is: {0}", thr.Name);
}
Console.WriteLine();
// Display the priority of main thread
Console.WriteLine("The priority of main"+
" thread is: {0}", thr.Priority);
// Set the name of main thread
thr.Name = "Main Thread";
Console.WriteLine();
// Display the name of main thread
Console.WriteLine("The name of main "+
"thread is: {0}", thr.Name);
}
}
输出:
Main thread does not have name
The priority of main thread is: Normal
The name of main thread is: Main Thread
使用主线程进行死锁
我们可以仅通过使用主线程(即仅使用一个线程)来创建死锁。下面的C#程序演示了这一点。
例子:
// C# program to demonstrate deadlock
// using the Main thread
using System;
using System.Threading;
public class GFG {
// Main Method
public static void Main()
{
try {
Console.WriteLine("Enter into DEADLOCK!!");
Thread.CurrentThread.Join();
// the following statement
// will never execute
Console.WriteLine("This statement will never execute");
}
catch (ThreadInterruptedException e) {
e.ToString();
}
}
}
输出:
Enter into DEADLOCK!!
运行时错误:
Max real time limit exceeded due to either by heavy load on server or by using sleep function
说明:语句“ Thread.currentThread().join()
”将告诉主线程等待该线程死亡(即等待自身)死亡。因此,主线程等待自己死亡,这只是一个死锁。