大家应该掌握的多线程编程大家应该掌握的多线程编程
毫无疑问,多线程在各种编程语言中都占有比较重要的一个席位。不管你是初学者,还是资深的老司机,多线程是在学习,面
试和工作中都要经常被提及的一个话题,下面我们就来看一看具体的相关内容。
1、多线程编程必备知识
1.1 进程与线程的概念
当我们打开一个应用程序后,操作系统就会为该应用程序分配一个进程ID,例如打开QQ,你将在任务管理器的进程选项卡看
到QQ.exe进程,如下图:
进程可以理解为一块包含了某些资源的内存区域,操作系统通过进程这一方式把它的工作划分为不同的单元。一个应用程序可
以对应于多个进程。
线程是进程中的独立执行单元,对于操作系统而言,它通过调度线程来使应用程序工作,一个进程中至少包含一个线程,我们
把该线程成为主线程。线程与进程之间的关系可以理解为:线程是进程的执行单元,操作系统通过调度线程来使应用程序工
作;而进程则是线程的容器,它由操作系统创建,又在具体的执行过程中创建了线程。
1.2线程的调度
在操作系统的书中貌似有提过,“Windows是抢占式多线程操作系统”。之所以这么说它是抢占式的,是因为线程可以在任意时
间里被抢占,来调度另一个线程。操作系统为每个线程分配了0-31中的某一级优先级,而且会把优先级高的线程优先分配给
CPU执行。
Windows支持7个相对线程优先级:Idle、Lowest、BelowNormal、Normal、AboveNormal、Highest和Time-Critical。其
中,Normal是默认的线程优先级。程序可以通过设置Thread的Priority属性来改变线程的优先级,该属性的类型为
ThreadPriority枚举类型,其成员包括Lowest、BelowNormal、Normal、AboveNormal和Highest。CLR为自己保留了Idle和
Time-Critical两个优先级。
1.3线程也分前后台
线程有前台线程和后台线程之分。在一个进程中,当所有前台线程停止运行后,CLR会强制结束所有仍在运行的后台线程,这
些后台线程被直接终止,却不会抛出任何异常。主线程将一直是前台线程。我们可以使用Tread类来创建前台线程。
using System;
using System.Threading;
namespace 多线程1
{
internal class Program
{
private static void Main(string[] args)
{
var backThread = new Thread(Worker);
backThread.IsBackground = true;
backThread.Start();
Console.WriteLine("从主线程退出");
Console.ReadKey();
}
private static void Worker()