C#多线程系列之线程的创建和生命周期
线程的创建
在C#中,要创建一个新线程可以有三种方法:
1. 使用Thread类
可以通过创建Thread类对象并将其启动来创建新线程。Thread类的构造函数可以传递一个无参数的方法,该方法将在新线程中执行。Thread类中的Start方法将启动线程。
using System.Threading;
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(TestMethod));
thread.Start();
}
static void TestMethod()
{
Console.WriteLine("线程已启动");
}
}
2. 使用ThreadPool
线程池是一组用于执行异步操作的线程。我们可以使用ThreadPool.QueueUserWorkItem方法将工作项添加到线程池中,以便由线程池中的线程执行。
using System.Threading;
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TestMethod));
}
static void TestMethod(object state)
{
Console.WriteLine("线程已启动");
}
}
3. 使用Task类
Task类是一个可以执行异步操作的轻量级对象。我们可以使用Task.Factory.StartNew方法创建一个新的Task对象,并将其启动。Task对象将在新线程中执行指定的方法。
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(TestMethod);
}
static void TestMethod()
{
Console.WriteLine("线程已启动");
}
}
线程的生命周期
一个线程的生命周期由以下阶段组成:
1. 就绪状态
当一个线程被创建时,它处于就绪状态。此时线程已经分配了必要的系统资源,并准备执行。但是,该线程还没有获得处理器时间,因此没有真正开始执行。
2. 运行状态
当系统调度器为一个线程分配处理器时间时,该线程进入运行状态。此时线程开始执行线程体中的代码。
3. 堵塞状态
在某些情况下,线程的运行可能会受到阻碍,例如等待一个互斥锁,等待用户输入等。这时线程进入堵塞状态,即该线程会暂停执行并释放处理器时间,直到阻塞操作完成。
4. 结束状态
当线程的线程体中的代码执行完成,或者线程异常终止时,该线程进入结束状态。此时,线程占用的资源会被系统回收,该线程将不再执行。
以下是一个线程的完整生命周期示例:
using System.Threading;
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(TestMethod));
thread.Start();
Thread.Sleep(1000);
Console.WriteLine("线程状态:" + thread.ThreadState);
}
static void TestMethod()
{
Console.WriteLine("线程已启动,状态:" + Thread.CurrentThread.ThreadState);
Thread.Sleep(500);
Console.WriteLine("线程正在执行,状态:" + Thread.CurrentThread.ThreadState);
Thread.Sleep(500);
Console.WriteLine("线程将进入等待状态,状态:" + Thread.CurrentThread.ThreadState);
AutoResetEvent are = new AutoResetEvent(false);
are.WaitOne();
Console.WriteLine("线程将结束,状态:" + Thread.CurrentThread.ThreadState);
}
}
在上面的示例中,新线程被创建并启动,它开始执行TestMethod方法。在TestMethod方法中,线程先执行一段代码,然后等待500毫秒,再执行一段代码,并再次等待500毫秒。在等待500毫秒后,线程将进入等待状态,并等待AutoResetEvent对象的信号。在主线程中,我们等待1000毫秒后,输出新线程的状态,此时它应该是正在等待AutoResetEvent对象的信号。最后,我们调用AutoResetEvent.Set方法,从而唤醒等待的线程,该线程执行完TestMethod方法后进入结束状态。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程系列之线程的创建和生命周期 - Python技术站