线程,有时被称为轻量进程(LightWeight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
一、进程与线程进程(Process)和线程(Thread)是操作系统 的基本概念,但是它们比较抽象并且不容易掌握。可以将进程理解为程序在计算机上的一次执行活动,而线程则是进程的一个实体。执行线程就体现程序的真实执行情况。
进程的概念1、进程
进程是程序在计算机上的一次执行活动。运行一个程序就相当于启动一个进程。Windows系统利用进程把工作划分为多个独立的区域,每个应用程序实例对应一个进程。每个进程所占用的资源都是互相独立的。
进程资源包括:
(1)一个进程堆;
(2)一个或多个线程;
(3)一个虚拟地址空间,该空间独立于其它进程的地址空间;
(4)一个或多个代码段,包括.dll中的代码;
(5)一个或多个包含全局变量的数据段;
(6)环境字符串,包括环境变量信息;
(7)其他资源,例如打开的句柄、其它的堆等。
2、多进程
多进程就是在同一计算机系统 中,同一个时刻允许两个或两个以上的进程处于运行状态。多进程具有以下特点:
(1)进程间互相独立,可靠性高。
(2)进程之间不共享数据,没有锁问题,结构简单。
(3)需要跨进程边界,多进程调度开销较大。
线程的概念1、线程
线程是程序中的一个执行流,每个线程都有自己的专用寄存器(栈、指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
注意:一个进程可以有多个线程,一个线程必须有一个父进程,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
2、多线程
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
(1)多线程具有以下优点。
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其他的线程而不是等待,这样就大大提高了程序的效率。
(2)多线程具有以下缺点。
① 线程也是程序,所有线程需要占用内存,线程越多占用内存也越多;
② 多程序需要协调和管理,所以需要CPU时间跟踪线程;
③ 线程之间对共享资源的访问会相互影响,必须 解决竞用共享资源的问题
④ 线程太多会导致控制太复杂,最后可能造成很多Bug。
3、线程的生命周期
线程生命周期开始于System.Threading.Thread类的对象被创建时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各种状态
(1)未启动状态:当线程实例被创建,但Start方法未被调用时的状况。
(2)就绪状态:当线程准备好运行并等待CPU周期时的状况。
(3)不可运行状态:已经调用Sleep方法、Wait方法或者通过I/O操作阻塞时,线程是不可运行的。
(4)死亡状态:当线程已完成执行或已中止时的状况。
在C#中,Thread类用于线程的工作。它允许创建并访问多线程应用程序 中的单个线程。进程中第一个被执行的线程称为主线程。
编写程序,获取当前的主线程,并为其命名。
可以通过Thread类的静态属性CurrentThread获取当前执行的线程,然后通过Name属性赋值”MainThread“。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Thread th=Thread.CurrentThread;
th.Name = "MainThread";
Console.WriteLine("This is { 0 }", th.Name);
Console.ReadLine();
}
}
}
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Thread th=Thread.CurrentThread;
th.Name = "MainThread";
Console.WriteLine("This is {0}", th.Name);
Console.ReadLine();
}
}
}
运行结果:
Thread类在.NET Framework中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。
| 属性 | 说明 |
| CurrentContext | |
| CurrentCulture | |
| CurrentPrinciple | |
| CurrentThread | |
| CurrentUICulture | |
| ExecutionContext | |
| IsAlive | |
| IsBackground | |
| IsThreadPoolThread | |
| ManagedThreadId | |
| Name | |
| Priority | |
| ThreadState |
| 方法 | 说明 |
| Abort | 在调用此方法的线程上引发ThreadAboutException,以开始终止此线程的过程。调用此方法通常会终止线程 |
| GetApartmentState | 返回表示单元状态的ApartmentState值 |
| GetDomain | 返回当前线程正在其中运行的当前域 |
| GetDomainID | 返回唯一的应用程序域标识符 |
| Interrupt | 中断处于WaitSleepJoin线程状态的线程 |
| Join | 在此实例表示的线程终止前,阻止调用线程 |
| ResetAbort | 取消当前线程所请求的Abort(Object) |
| SetApartmentState | 在线程启动前设置其单元状态 |
| Sleep | 将当前线程挂起指定的时间 |
| SpinWait | 导致线程等待由iterations参数定义的时间量 |
| Start | 使线程得以按计划执行 |
| Suspend | 挂起线程,或者如何线程已挂起,则不起作用 |
| VolatileRead | 读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值 |
| VolatileWrite | 立即向字段写入一个值,以使该值对计算机中的所有处理器都可见 |
通过使用Thread类,可以对线程进行创建、休眠、挂起、恢复、终止及设置优先权等操作。
创建线程 线程休眠 线程的挂起与恢复 终止线程 线程的优先级 暑期编程PK赛 得CSDN机械键盘等精美礼品!


