C# 第八章『多线程』◆第1节:进程与线程

        线程有时候被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作称为多线程。进程(Process)和线程(Thread)是操作系统的基本概念。

        一、进程的概念

        1、进程

        进程是程序在计算机上的一次执行活动。运行一个程序就相当于启动一个进程。Windows系统利用进程把工作划分为多个独立的区域,每个应用程序实例对应一个进程。进程是操作系统分配和使用系统资源的基本单位。进程包含正在运行时应用程序的所有资源。每个进程所占用的资源都是相互独立的。

        2、多进程

        多进程就是在同一计算机系统中,同一个时刻允许两个或两个以上的进程处于运行状态。多进程具有以下特点:

        ①进程间相互独立,可靠性高。

        ②进程之间不共享数据,没有锁问题,结构简单。

        ③需要跨进程边界,多进程调度开销较大。

        二、线程的概念

        1、线程

        线程是程序中一个执行流,每个线程都有自己的专有寄存器(栈、指针、程序计数器等),但代码区是共享的,即不同的进程可以执行同样的函数。

        注意:一个进程可以有多个线程,一个线程必须有一个父进程,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

        2、多线程

        多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

        多线程的优点:

  • 可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其他的线程而不是等待,这样可以提高效率。
  • 区分具有不同优先级的任务。
  • 使用户界面可以在将时间分配给后台任务时,仍可以快速做出响应。
  • 通过网络与Web服务器的数据库进行通信。
  • 方便执行占用大量时间的操作。

        多线程的缺点:

  • 线程也是程序,所以线程需要占用内存,线程越多,占用的内存也就越多。
  • 跟踪大量的线程将占用处理器大量时间。如果线程过多,则其中大多线程都不会产生明显的进度。如果大多数线程处于一个进程中,则其他进程中的线程的调度频率会很低。
  • 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。
  • 使用多个线程控制代码执行非常复杂,并可能产生某些bug。
  • 销毁线程需要了解可能发生的问题并进行处理。

        3、线程的生命周期

        线程首先是创建:用new关键字创建线程对象,但是此时声明还没有做。然后线程对象调用Start方法,使线程进入就绪状态,也称为可执行状态,此时线程等待CPU为其分配CPU时间片。当获得系统资源的时候,即CPU来执行时,线程就进入了运行状态。

        一旦线程进入运行状态,就会在就绪状态与运行状态下转换,同时也有么能进入暂停状态。即在运行期间执行了Sleep、Join等方法,或者有外界因素导致线程阻塞(如等待交互或通信断开),在遇到这些操作场景时,线程就会进入暂停状态。

        暂停状态与就绪状态是不一样的:暂停状态下的线程是持有系统资源的,只是没有进行任何操作。当休眠时间结束或用户交互完成后,线程就会从暂停状态回到就绪状态(这里的就绪状态不是运行状态)。因为此时需要检查CPU是否有剩余资源来执行线程。当线程中所有的代码都执行完后,调用Abort方法终止线程,这个线程就会结束,即进入死亡状态,同时垃圾回收管理器就会回收死亡的线程对象。

        线程声明周期开始于System.Threading.Thread类的对象被创建时,结束于线程被终止或完成执行时。

        线程生命周期中的各种状态:

  1. 未启动状态:当线程实例被创建,但Start方法未被调用时的状态。
  2. 就绪状态:当线程准备好运行并等待CPU周期时的状况。
  3. 运行状态:开始运算函数。
  4. 暂停状态:已经调用Sleep()、Join()、Wait()或者通过I/O输入输出时等,此时线程是不可运行的。休眠结束或输入输出完成时会到就绪状态。
  5. 死亡状态:当线程已经完成执行或已中止时的状况。

        在C#中,Thread类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程成为主线程。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th1 = Thread.CurrentThread;
            th1.Name = "MainThread";
            Console.WriteLine("This is {0}", th1.Name);
        }
    }
}

        三、Thread类

        Thread类位于System.Threading命名空间中,该类主要用于创建并控制线程、设置线程优先级并获取其状态。

        Thread类的一些常用属性:(紫色为常用)

  • Thread.ApartmentState 属性:获取或设置此线程的单元状态。
  • Thread.CurrentContext 属性:获取线程正在其中执行的当前上下文。
  • Thread.CurrentCulture 属性:获取或设置当前线程的区域性。
  • Thread.CurrentPrincipal 属性:获取或设置线程的当前负责人(对基于角色的安全性而言)。
  • Thread.CurrentThread 属性:获取当前正在运行的线程。
  • Thread.CurrentUICulture 属性:获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。
  • Thread.ExecutionContext 属性:获取 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。
  • Thread.IsAlive 属性:获取指示当前线程的执行状态的值。
  • Thread.IsBackground 属性:获取或设置一个值,该值指示某个线程是否为后台线程。
  • Thread.IsThreadPoolThread 属性:获取指示线程是否属于托管线程池的值。【如果此线程属于托管线程池,则为 true;否则为 false。】
  • Thread.ManagedThreadId 属性:获取当前托管线程的唯一标识符。【一个整数,表示此托管线程的唯一标识符。】
  • Thread.Name 属性:获取或设置线程的名称。
  • Thread.Priority 属性:获取或设置指示线程的调度优先级的值。
  • Thread.ThreadState 属性:获取一个值,该值包含当前线程的状态。

         Thread类的一些常用方法:

  • Thread.Abort 方法:在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。
  • Thread.GetApartmentState 方法:返回表示单元状态的ApartmentState值
  • Thread.GetDomain 方法:返回当前线程正在其中运行的当前域。
  • Thread.GetDomainID 方法:返回唯一的应用程序域标识符。
  • Thread.Interrupt 方法:中断处于 WaitSleepJoin 线程状态的线程。
  • Thread.Join 方法:在此实例表示的线程终止前,阻止调用线程。
  • Thread.ResetAbort 方法:取消当前线程所请求的 Abort(Object)
  • Thread.SetApartmentState(ApartmentState) 方法:在线程启动前设置其单元状态。
  • Thread.Sleep 方法:将当前线程挂起指定的时间。
  • Thread.SpinWait(Int32) 方法:导致线程等待由 iterations 参数定义的时间量。
  • Thread.Start 方法:使线程得以按计划执行。
  • Thread.Suspend 方法:挂起线程,或者如果线程已挂起,则不起作用。
  • Thread.VolatileRead 方法:读取字段值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之后,则处理器无法将其移至此方法之前。
  • Thread.VolatileWrite 方法:向字段中写入值。 在需要进行此操作的系统上,插入防止处理器重新对内存操作进行排序的内存屏障,如下所示:如果读取或写入操作在代码中出现在此方法之前,则处理器无法将其移至此方法之后。

微软官方—Thread 类

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/126480063