进程(Process)
概念:进程(Process)是计算机中的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
简单理解:打开一个应用程序就是在操作系统上开启了一个线程。
特点:进程之间可以互相独立运行,互不干扰。
进程之间也可以互相访问、操作。
线程(Thread)
概念:线程是操作系统能够进行运算调度的最小单位。
线程被包含在进程之中,是进行中的实际运行单位。
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程。
进程是资源分配的基本单位,线程是独立调度的基本单位。
多线程
多线程是指在一个程序中,可以同时运行多个不同的线程。
语法
-
声明一个新线程
新线程要执行的代码逻辑被封装到一个函数语句块中。
Thread thread = new Thread(NewThread);
-
启动新新线程
thread.Start();
-
设置为后台线程
一般地,当前台线程或者主线程结束了,不管后台线程是否在进行,整个进程结束。后台线程不会阻碍应用程序的进程结束。所以,如果不将新的线程设置为后台线程,可能导致进程无法正常关闭。比如,将新线程设置成无限循环执行,当主线程代码已经执行完成时,新线程依然在循环,这样,就不能通过主线程结束来实现整个程序进程的结束。
thread.IsBackground = true;
-
关闭释放一个线程
如果新开的线程可以结束,则不需要特殊处理,正常结束。
如果新开的线程是死循环,终止这个线程的方式有两种。
static bool isRunning = true; static object object1 = new object(); static void Main(string[] args) { //方式一 //设置循环死循环标识 //Console.ReadKey(); //isRunning = false; //Console.ReadKey(); //方式二 //通过线程提供的方法(在.Net core版本中无法中止,会报错。) //thread.Abort(); } static void NewThread() { //新开线程,执行的代码逻辑在该函数语句块中。 while (isRunning) { //Thread.Sleep(1000); //Console.WriteLine("新开线程"); lock (object1) { Console.SetCursorPosition(10, 6); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("■"); } } }
-
线程休眠
休眠多少毫秒,1秒等于1000毫秒。
在哪个线程中执行,就让哪个线程休眠。
Thread.Sleep(1000);
多线程共享数据——锁
多个线程使用的内存是共享进程的,所以,当多个进程同时操作同一片内存区域时,会产生问题,代码执行顺序错乱。
可以通过加锁的形式避免此问题。
lock
语法:lock(引用类型对象) { }
static bool isRunning = true;
static object object1 = new object();
static void Main(string[] args)
{
while (isRunning)
{
lock (object1)
{
Console.SetCursorPosition(0, 0);
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("●");
}
}
}
static void NewThread()
{
//新开线程,执行的代码逻辑在该函数语句块中。
while (isRunning)
{
//Thread.Sleep(1000);
//Console.WriteLine("新开线程");
lock (object1)
{
Console.SetCursorPosition(10, 6);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("■");
}
}
}
多线程对于我们的意义
可以用多线程专门处理一些复杂耗时的逻辑,比如寻路,网络通信等。