一、什么是线程?
线程(Thread)是代码的执行序列或者执行路径。线程与进程的概念有一些相似,它类似于一个轻量级的进程:一个操作系统中可以运行多个进程,一个进程内可以运行多个线程。每个应用程序至少运行在一个线程上。当只有一个线程时,称作单线程应用程序,该线程由系统自动创建。例如下面的.Net Core 控制台应用程序Main方法。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine("我是单线程程序");
}
}
}
从线程的生命周期来看这个程序的执行过程如下:
每个线程都有一个入口点,上面的程序来说入口点即Main()方法,,执行Main()方法的线程通常被称为主线程(Main Thread),主线程的入口点也是应用程序的起始点。对于单线程程序来说,代码的执行顺序永远是至上而下的。也就是说,控制台中肯定是先输出“Hello World”再输出“我是一个单线程程序”。
二、多线程的好处
1、使用线程可以把占据长时间的程序中的任务放到后台去处理
2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
3、程序的运行速度可能加快
4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等
上面的程序只是输出了两行文字,所以不会感觉到运行时间上的差距。但是如果程序中某个任务需要很长时间完成,那么后面的执行步骤也得等待这个任务执行完成才能继续执行。举个生活中的例子:我们需要做晚饭,分为煮饭和炒菜两个环节,其中煮饭需要30分钟,而炒菜需要20分钟。用单线程去做的话,必须煮完饭再炒菜,那么就需要50分钟。而用多线程的做法是,先下米煮饭,同时炒菜,那样30分钟饭菜都好了。
using System;
using System.Threading;
namespace StudyThread
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);//记录开始时间
cookRice();
friedDsh();
Console.WriteLine(DateTime.Now);//记录结束时间
}
/// <summary>
/// 煮饭
/// </summary>
public static void cookRice()
{
Console.WriteLine("**********开始煮饭啦**********");
Thread.Sleep(1000*30); //让线程睡眠30秒模拟煮饭时间
Console.WriteLine("**********饭煮好啦**********");
}
/// <summary>
/// 炒菜
/// </summary>
public static void friedDsh()
{
Console.WriteLine("**********开始炒菜啦**********");
Thread.Sleep(1000 * 30); //让线程睡眠20秒模拟炒菜时间
Console.WriteLine("**********菜炒好啦**********");
}
}
}
从运行输出结果可以看出单线程执行,刚好用了一分钟。
三、线程的基本操作
3.1创建新线程
using System.Threading;
System.Threading命名空间下的Thread类提供了线程的基本操作。通过创建一个
Thread对象,并执行它的Start()方法,可以新建并运行一个新的线程。
还是用上面的煮饭炒菜的例子,代码修改如下:
using System;
using System.Threading;
namespace StudyThread
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);//记录开始时间
ThreadStart ts = new ThreadStart(friedDsh);//新线程的入口
Thread worker = new Thread(ts);//创建线程对象
worker.Start();
cookRice();
//friedDsh();
Console.WriteLine(DateTime.Now);//记录结束时间
}
/// <summary>
/// 煮饭
/// </summary>
public static void cookRice()
{
Console.WriteLine("**********开始煮饭啦**********");
Thread.Sleep(1000*30); //让线程睡眠30秒模拟煮饭时间
Console.WriteLine("**********饭煮好啦**********");
}
/// <summary>
/// 炒菜
/// </summary>
public static void friedDsh()
{
Console.WriteLine("**********开始炒菜啦**********");
Thread.Sleep(1000 * 30); //让线程睡眠20秒模拟炒菜时间
Console.WriteLine("**********菜炒好啦**********");
Console.WriteLine(DateTime.Now);//记录结束时间
}
}
}
从运行输出结果可以看出单线程执行,用时是31秒。煮饭和炒菜是同时进行的。