zoukankan      html  css  js  c++  java
  • C#多线程详解(二)

    在上一节介绍了线程的基础知识,下面来研究多线程的优先级

    using System;

    using System.Threading;

    namespace Test
    {
        class TestThread
        {
            private static void FirstThreadFun()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
                }
                Console.WriteLine(Thread.CurrentThread.Name + "的优先级:" + Thread.CurrentThread.Priority);
                Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
            }

            private static void SecondThreadFun()
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
                }
                Console.WriteLine(Thread.CurrentThread.Name + "的优先级:" + Thread.CurrentThread.Priority);
                Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
            }

            static void Main(string[] args)
            {
                //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].

                Thread.CurrentThread.Name = "MainThread";

        //创建第二个线程

                Thread secondThread = new Thread(new ThreadStart(TestThread.SecondThreadFun));
                //取名为 secondThread
                secondThread.Name = "secondThread";
                //设定线程的优先级为AboveNormal[在所有创建的新线程中,执行顺序为第二]

                secondThread.Priority = ThreadPriority.AboveNormal;

        //创建第一个线程
                Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
                //取名为 firstThread
                firstThread.Name = "firstThread";
                //设定线程的优先级为最高级[在所有创建的新线程中,最先执行.线程优先级默认为Normal,共5 级:Highest,AboveNormal,Normal,BelowNormal,Lowest]

                firstThread.Priority = ThreadPriority.Highest;


                for (int z = 0; z < 20; z++)
                {
                    if (z == 10)
                    {
                        firstThread.Start();
                        firstThread.Join();

                        secondThread.Start();
                        secondThread.Join();
                    }
                    else
                    {
                        Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                    }
                }
                Console.Read();
            }
        }

    }

    运行结果:

     

     运行结果显示:

    1.主线程永远是最先执行的,但当新线程启动[Thread.Start()],并加入[Thread.Join()]后,主线程会暂停.

    2.创建的两个新线程 firstThread 和 secondThread , firstThread的优先级被设为最高 Highest , secondThread的优先级被设为第二.

    3.启动和加入也是按顺序的启动 firstThread 先启动加入, secondThread 紧随其后.

    4.如果将 firstThread secondThread 的启动[Thread.Start()]顺序调换后会是什么结果?[下节讨论]

    线程的优先级

    当线程之间争夺CPU时间时,CPU 是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。

    给一个线程指定优先级,我们可以使用如下代码:
    //设定优先级为最低
    myThread.Priority=ThreadPriority.Lowest;

    通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。

     

  • 相关阅读:
    『高性能模型』轻量级网络ShuffleNet_v1及v2
    『计算机视觉』物体检测之RefineDet系列
    『计算机视觉』目标检测前沿及回顾(2018)
    『高性能模型』轻量级网络MobileNet_v2
    『流畅的Python』第14章:可迭代的对象、迭代器和生成器
    『流畅的Python』第12章:继承的优缺点
    『关键点检测』CPN:Cascaded Pyramid Network for Multi-Person Pose Estimation
    『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支
    『计算机视觉』Mask-RCNN_训练网络其三:训练Model
    『计算机视觉』mini深度学习框架实现
  • 原文地址:https://www.cnblogs.com/bicabo/p/1647916.html
Copyright © 2011-2022 走看看