• C# Thread类 线程优先级


    1.C#对线程进行操作时,通过Thread类,可以对线程进行创建、挂起、恢复、休眠、终止及设置优先级。

    Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 

    在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级

    2.Thread类常用的属性: 

    CurrentThread           获取当前正在运行的线程

    IsAlive                 获取一个值,该值只是当前线程的执行状态

    Name                    获取或设置线程的名称

    Priority                获取或设置一个值,该值只是线程的调度优先级 

    ThreadState             获取一个值,该值包含当前线程的状态

    3.Thread类常用的方法: 

    Abort                   调用此方法通常会终止线程

    Join                    阻止调用线程,直到某个线程终止时为止

    Resume                  继续已挂起的线程

    Sleep                   将当前线程阻止指定的毫秒数

    Start                   使线程被安排进行执行

    Suspend                 挂起线程,或者如果线程已挂起,则不起作用

    4.创建线程--Start()方法

    创建一个线程,只需将其声明并为其提供线程起始点处的方法委托。

    Thread类具有接受一个ThreadState委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法。

    只有在调用Start方法后才会创建实际的线程。Start方法的 两种重载方式 :

    (1)导致操作系统将当前实例的状态更改为ThreadState.Running

    语法: public void Start()

    说明:该方法无参数,无返回值

    (2)使操作系统当前实例的状态更改为 ThreadState.Running,并选择线程执行所需要的方法

    语法: public void Start(Object parameter)

    说明:参数parameter表示一个对象,包含线程执行的方法要使用的数据

    注意:如果线程已经终止,就无法通过再次调用Start方法来重新启动

    5.线程的挂起与恢复--Suspend方法和Resume方法

    (1)Suspend方法

    该方法用来挂起线程,如果线程已经挂起则不起作用

    语法:public void Suspend()

    说明:调用Suspend方法挂起线程时,.net允许要挂起的线程再执行几个指令,目的是为了到达.net认为线程可以安全挂起的状态

    (2)Resume方法

    该方法用来继续已挂起的线程

    语法:public void Resume()

    说明:通过Resume方法来恢复被暂停的线程是,无论调用了多少次Suspend方法,调用Resume方法均会使另外的线程脱离挂起状态,并导致当前线程继续执行

    6.线程休眠--Sleep()方法

    该方法用来将当前线程阻止指定的时间,有 两种重载方式

    (1)将当前线程挂起指定的时间

    语法: public static void Sleep(int millisecondsTimeout)

    说明:参数 millisecondsTimeout表示线程被阻止的毫秒数,指定零以指示应挂起此线程以使其他等待线程能够执行;指定Infinite以无限期阻止线程

    (2)将当前线程阻止指定的时间

    语法: public static void Sleep(TimeSpan timeout)

    说明:参数timeout表示线程被阻止的时间量的TimeSpan,指定零以指示应挂起此线程以使其他等待线程能够执行;指定Infinite以无限期阻止线程

    7.终止线程

    终止线程可以分别使用Abort方法和Join方法实现

    (1)Abort方法

    用来终止线程,有 两种重载形式 ,都是引发的ThreadAbortExecption

    public void Abort()--终止进程

    public void Abort(Object stateInfo)--终止线程并提供有关线程终止的异常信息

    参数stateInfo是一个对象,包含应用程序特定的信息(如状态),该信息可供正被终止的线程使用

    (2)Join方法

    Join用来阻止调用线程,直到某个线程终止时为止。有 三种重载形式

    public void Join()

    public bool Join(int millisecondsTimeout)

    说明:参数 millisecondsTimeout表示等待线程终止的毫秒数。如果线程已终止,则返回值为true,如果线程经过了 millisecondsTimeout指定时间后未终止,返回值为false 

    public bollJoin(TimeSpan timeout)

    说明:参数 timeout表示等待线程终止的时间量TimeSpan。如果线程已终止,则返回值为true,如果线程经过 timeout时间量之后未终止,则返回值为false

    8.线程的优先级

    AboveNormal      可以将Thread安排在具有highest优先级线程之后,在Normal之前

    BelowNormal      在Normal之后,Lowest之前

    Highest          在具有任何其他优先级的线程之前

    Lowest           在具有其他任何优先级的线程之后

    Normal           在AboveNormal之后,BelowNormal之前。默认值。

    可以通过调用线程的Priority属性来获取和设置其优先级。Priority属性用来获取或设置一个值,该值指示线程的调度优先级。

    语法:public ThreadPriority Priority{get;set;}

    说明:属性值是ThreadPriority枚举值之一,默认值为Normal。

    实例代码:

    static void Main(string[] args)
    {
    Thread thread1 = new Thread(new ThreadStart(Thread1)); //使用自定义方法Thread1声明线程
    thread1.Priority = ThreadPriority.Lowest; //设置线程的调度优先级
    Thread thread2 = new Thread(new ThreadStart(Thread2)); //使用自定义方法Thread2声明线程
    thread1.Start(); //开启线程一
    thread2.Start(); //开启线程二
    Console.ReadLine();
    } static void Thread1()
    {
    Console.WriteLine("线程一");
    } static void Thread2()
    {
    Console.WriteLine("线程二");
    }

    运行截图:

    注意:这里很多人都疑惑了,既然thread1优先级比thread2优先级低,为什么还是先输出的thread1的内容呢?

    其实那是因为你不了解线程的优先级实现原理 
    线程的优先级并不是你想象的先执行哪个后执行哪个 
    而是所有的线程不论优先级高低都会执行, 
    优先级越高表示CPU分配给该线程的时间片越多,执行时间就多 
    优先级越低表示CPU分配给该线程的时间片越少,执行时间就少 

  • 相关阅读:
    Html5新标签解释及用法
    时间线效果
    NHibernate数据访问层核心代码
    C#开源资源项目
    安卓开发环境搭建之最新版(So Easy!)
    WIN8相关资源汇总
    HTML5 Shiv – 让该死的IE系列支持HTML5吧
    WCF 提高传输数据性能方法之二 (数据分割)
    支付宝集成问题(.net篇)
    WCF 提高传输数据性能方法之一 (使用压缩)
  • 原文地址:https://www.cnblogs.com/Peng18233754457/p/7799801.html
Copyright © 2020-2023  润新知