1.线程示例:
在计算机世界,一些计算工作是可以同时进行的,这样提升了运行的效率,这就是多线程的优势。举一个不太恰当的例子,假设生活中,我们需要做家务。假设有4个房间需要整理,如果只有我自己,那么我需要逐个整理4个房间。假设我找到了另外一个人帮忙,没人整理2个房间,这样的效率就提升了一倍。
这个例子中,我是一个主线程,由我来发起工作。另外的人去做什么,怎么做,由我来指定。下面是一个多线程示例:
using System;
using System.Threading;
namespace ConcurrentCSharp
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(PrintNum);
t.Name = "Thread t";
t.Start();
Console.WriteLine("Main thread", Thread.CurrentThread.Name);
}
static void PrintNum()
{
Console.WriteLine("Thread t starting...");
for(int i=1;i<10;i++)
{
Console.WriteLine("{0},{1}",Thread.CurrentThread.Name,i);
}
}
}
}
程序有入口main进来,自身是一个主线程。由于它一个人做不完,于是它声明了一个线程Thread t实例来帮忙。这个线程去做什么呢。它去打印一些数字。主线程在这个实例工作的时候,自己还可以去做其他的事情,两者可以同时进行。最终运行的结果是,我们知道哪些工作是线程来做的,哪些是主线程来做的。运行效果如下:
当然,我们可以初始化很多线程(请很多人帮忙),这样工作可以更快完成。当然这个与操作系统资源有关。如果太多,操作系统不断切换线程,也是很浪费资源
2.暂停线程
通过Thread.Sleep(TimeSpan.FromSeconds(10))代码,可以暂停当前线程运行10秒。有时候计算太占用CPU时间片,我们需要等待一下,让cpu可以空闲去执行一些其他操作,避免让当前线程占用全部的资源;
3.线程等待
用刚才那个收拾房间的例子就是,假设我请了一个人帮忙。但是他可能做得很快,也可能做得很慢。我需要在他做完的时候,才进行下一步的工作。那么通过sleep是不妥的,以为可能做得很快,有可能做得慢。这与计算机的性能存在关联。这个时候,需要通过Thread 实例,调用Join来完成等待。主线程调用子线程t.Join()后,主线程阻塞。直到子线程t执行完成以后。主线程才可以继续执行。
本节结束,下一节,我们将线程终止及检测线程的状态等