进程和线程是现代操作系统的重要概念。前者是应用程序的实例,一个正在运行的应用程序在操作中被视为一个进程。为了使多个任务互不干扰的进行,每个进程都拥有独立的虚拟地址空间、代码段、数据段及堆栈等。另外,进程还占了各种系统资源(如文件、窗体对象。环境变量等)。进程拥有自身独立的资源,进程之间相互隔离,互不干扰。
线程是操作系统分配处理器时间的基本单元,他也是一组指令的集合,可以在程序中独立执行,所以有时也被称为轻量级进程或微进程,一个进程可以包含一个或多个线程,线程共享所属进程所拥有的资源,可以访问其所属进程的内存区域和代码段。同时,线程还拥有各自的局部变量与独立的栈空间,所有线程都允许并发的执行,每个进行至少有一个线程来执行它的代码,如果没有线程来执行,系统就会自动撤销该进程和它的地址空间。
通常,当执行一个线程后,该线程会经历一个生命周期,即开始,就绪,运行,休眠,终止状态等。这些状态可以通过线程的ThreadState属性来获取。
用一个例子来学习一下如何控制线程:要求当计数器达到4,8时,第一个线程进行休眠状态,第二个线程一旦检查到第一个线程处于WaitSleepJoin状态,就立即中断第一个线程,将其放回队列中。
运行结果:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Test1_1
{
class HelloWorld
{
public static Thread sleeper;
public static Thread awaker;
public void SleepThread()
{
for (int i = 1; i < 10; ++i)
{
Console.Write(i + ",");
if (i == 4 || i == 8)
{
Console.WriteLine("thread is sleep at " + i);
try
{
Thread.Sleep(20); //暂停线程
}
catch (ThreadInterruptedException ex) //捕获中断异常
{
Console.WriteLine("thread is interrupted");
}
}
}
}
public void AwakerThread()
{
for (char ch = 'A'; ch < 'K'; ++ch)
{
Console.Write(ch + ",");
if (sleeper.ThreadState == ThreadState.WaitSleepJoin)
{
Console.WriteLine("thread is awake at " + ch);
sleeper.Interrupt(); //中断线程
}
}
}
static void Main(string[] args)
{
HelloWorld mi = new HelloWorld();
sleeper = new Thread(new ThreadStart(mi.SleepThread)); //创建第一个线程
awaker = new Thread(new ThreadStart(mi.AwakerThread)); //创建第二个线程
sleeper.Start(); //启动第一个线程
awaker.Start(); //启动第二个线程
Console.Read();
}
}
}
Thread.sleep:立即将当前线程暂停一段时间,以便操作系统处理其他线程。
Thread.Interrupt()会中断处于休眠的线程,将其重新放回调度队列中,会在目标线程引发ThreadInterruptedException异常。应该捕获该异常,以便执行适当操作后继续运行该线程。