- 进程:一个正在运行的程序就是一个进程。操作系统根据进程分配各种资源(内存…)
首先打开任务管理器,查看当前运行的进程:
从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。
- 线程
在任务管理器里面查询当前总共运行的线程数:
线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。
线程:操作系统为了提高效率会将一个进程分成多个线程,并按照线程来分配CPU执行时间
线程特点:在具有多线程CPU的计算机中,可以并行执行。
ThreadStart 委托定义:(下图)
Thread类:表示托管线程,每一个Thread对象都代表一个托管线程,每个托管线程会对应一个函数。
创建多线程的步骤:
1、编写线程所要执行的方法
2、实例化Thread类,并传入一个指向线程所要执行方法的委托。(这时线程已经产生,但还没有运行)
3、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定
简单事例:
class Program
{
static void Main(string[] args)
{
hreadDemoClass demoClass = new ThreadDemoClass();
//创建一个新的线程
Thread thread = new Thread(demoClass.Run);
//设置为后台线程
thread.IsBackground = true;
//开始线程
thread.Start();
Console.WriteLine("Main thread working...");
Console.WriteLine("Main thread ID is:" +
Thread.CurrentThread.ManagedThreadId.ToString());//主线程
Console.ReadKey();
}
}
public class ThreadDemoClass
{
public void Run()
{
Console.WriteLine("Child thread working...");
Console.WriteLine("Child thread ID is:" +
Thread.CurrentThread.ManagedThreadId.ToString());//子线程
}
}
执行结果:
前台线程和后台线程
前台线程:只有所有的前台线程都结束,应用程序才能结束。默认情况下创建的线程都是前台线程。
后台线程:只要所有的前台线程结束,后台线程自动结束。通过Thread.IsBackground设置后台线程。必须在调用Start方法之前设置线程的类型,否则一旦线程运行,将无法改变其类型。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //演示前台、后台线程
6 BackGroundTest background = new BackGroundTest(10);
7 //创建前台线程
8 Thread fThread = new Thread(new ThreadStart(background.RunLoop));
9 //给线程命名
10 fThread.Name = "前台线程";
11
12
13 BackGroundTest background1 = new BackGroundTest(20);
14 //创建后台线程
15 Thread bThread = new Thread(new ThreadStart(background1.RunLoop));
16 bThread.Name = "后台线程";
17 //设置为后台线程
18 bThread.IsBackground = true;
19
20 //启动线程
21 fThread.Start();
22 bThread.Start();
23 }
24 }
25
26 class BackGroundTest
27 {
28 private int Count;
29 public BackGroundTest(int count)
30 {
31 this.Count = count;
32 }
33 public void RunLoop()
34 {
35 //获取当前线程的名称
36 string threadName = Thread.CurrentThread.Name;
37 for (int i = 0; i < Count; i++)
38 {
39 Console.WriteLine("{0}计数:{1}",threadName,i.ToString());
40 //线程休眠500毫秒
41 Thread.Sleep(1000);
42 }
43 Console.WriteLine("{0}完成计数",threadName);
44
45 }
46 }
运行结果:前台线程执行完,后台线程未执行完,程序自动结束。
把bThread.IsBackground = true注释掉,运行结果:主线程执行完毕后(Main函数),程序并未结束,而是要等所有的前台线程结束以后才会结束。
后台线程一般用于处理不重要的事情,应用程序结束时,后台线程是否执行完成对整个应用程序没有影响。如果要执行的事情很重要,需要将线程设置为前台线程。