程序是由线程组成,线程是程序中的一个执行流,每个程序最少有一个线程组成。一个程序由多个线程组成,称为多线程。
假设:公园的湖中只有一条船,船上每次只能坐一个人出去游览一圈,这条船就好像电脑的CPU,而让每个乘客坐船坐到尽兴被看作是一条完整线程,对于未尽兴的坐完一圈继续排队。游船有规定老弱病残的优先坐船,这就形成了线程的优先级。而游客有的坐两圈则尽兴,有的坐一百圈还未尽兴,这就形成了线程对CPU的占用时间的长短差异。(现实中的线程不会这么文明,是争抢式)
多线程的优点:可以提高CPU的利用率,增加客户体验,避免单一操作。
缺点:大量的使用线程增加内存和CPU负担,由于程序中的代码是共享的,所以难以控制,操作比较复杂。
下面是一段控制台程序
Private void Display()
{
…….
}
static void Main(string[] args)
{
//线程的实例需要一个委托作为参数,ThreadStart委托必须为无参的
Thread myThread = new Thread(new ThreadStart(Display));
//设置线程的优先级
myThread.Priority = ThreadPriority.BelowNormal;
//启动线程
myThread.Start();
//主线程等待状态,直到线程myThread执行结束,主线程接着往下运行。
myThread.Join();
//让当前线程睡1秒钟
Thread.Sleep(1000);
}
当我们使用有参数的委托来实例化线程时:
Private void Display(object obj)
{
…….
}
static void Main(string[] args)
{
Thread myThread = new Thread(new ParameterizedThreadStart(Display));
myThread.Start(55);
}
由于TreadStart(object),在委托的方法中要转变成我们想要的类型。
Thread.ThreadState 属性
这个属性代表了线程运行时状态
Aborted:线程已停止;试用后线程不能被唤醒,临时停止线程不使用本方法;
AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;
Background:线程在后台执行,与属性Thread.IsBackground有关;
Running:线程正在正常运行;
Stopped:线程已经被停止;
StopRequested:线程正在被要求停止;
Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);
SuspendRequested:线程正在要求被挂起,但是未来得及响应;
Unstarted:未调用Thread.Start()开始线程的运行;
WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态
MSDN介绍:
在创建托管线程时,该线程处于 Unstarted状态。线程会保持 Unstarted状态,直到被操作系统转移到已启动状态。调用 Start使操作系统知道该线程可启动,它不更改线程的状态。
进入托管环境的非托管线程已处于已启动状态。一旦处于已启动状态中,就可以执行许多操作来使线程更改状态。下表列出使状态发生更改的操作以及相应的新状态。
一旦线程由于调用 Start而离开 Unstarted状态,那么它将无法再返回到 Unstarted状态。同样,线程也永远无法离开 Stopped状态。
线程的优先级
当线程之间争夺CPU时间时,CPU是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,
由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。
注:有些观点紧代表个人,有什么不对的地方欢迎指出,感激不尽,共同进步!