zoukankan      html  css  js  c++  java
  • 转载 【.NET基础】--委托、事件、线程(3)

     

     

    之前的两篇文章我们了解了委托和事件,本文我们看一下线程。

    1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程。

    2,进程和线程的关系:

      A,进程,包含程序运行所需要的资源 ,在大多数情况下是指 程序。(商店:囤积要使用的资源的地方)

      B,线程,是在进程中能够被CPU调用的程序单元,是提供给CPU运行程序的代码片段。(商店员工:是运行程序的行动者)

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

      D,同一进程中的多个线程之间可以“并发”执行

    3,多线程的目的:

      A,让CPU主动执行不同的程序单元,这样就不至于被某个程序的恶意代码引起死机症状

      B,让计算机“同时”做多个事情,节约时间

      C,CPU在不同的线程里面切换,在不同的进程里面切换

    5,线程的调度方式:

      A,非抢占式调度:是指某个线程在运行的过程中不会被操作系统强制性暂停,线程可以一直运行到告一段落或者主动交出运行权。线程的运行完全是单队列的(像排序买票一样),这样可能产生恶意程序长期霸占运行权的情况,而且一旦一个程序死掉了,电脑只能重启了。

      B,抢占式调度:每个线程有极少的运行时间(在Windows内核模式下这个时间不会超过20ms),当时间用完的时候线程就会被强制暂停,保存上下文并把CPU的运行权交给下一个线程,这样调度的结果就是所有的线程都在被快速的切换运行,这样给客户端的感觉就是线程在“并行同时” 运行。

      C, 线程的调用由CPU决定,所以调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。

    6,线程切换的时候保存线程当前的执行状态,也就是线程当前的执行会话

       线程中的寄存器存在当前执行的代码号,堆栈存储当前运行的变量的值。当CPU执行再次回到这个线程的时候读取之前寄存器和堆栈中保存的数据。

       程序代码,编译以后是CPU的指令集,CPU对指定集执行只读操作。 如下图:

     

    7,如何实现多线程?

      A, 编写产生线程需要执行的方法

      B,引用System.Threading命名空间

      C,实例化Thread类,并传入一个指向线程所需要运行方法的委托(线程已经产生,还没有开始运行)

      D,调用Tread实例的Start方法,标记该线程可以被CPU执行了(具体执行时间由CPU决定)

    复制代码
     /// <summary>
            /// 多线程
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnThread_Click(object sender, EventArgs e)
            {
                //1,创建线程并通过委托语法糖 传入方法
                Thread thrSon = new Thread(CountDo);
                //2,设置为后台线程
                thrSon.IsBackground = true;
                //3,启动线程
                thrSon.Start();
            }
    
            void CountDo()
            {
                int i = 0;
                while (true)
                {
                    if (i < 999999999)
                    {
                        i++;
                    }
                    else
                    {
                        break;
                    }
                }
                MessageBox.Show("计算完毕:" + i);
            }
    复制代码

     8,线程到底是什么?

      线程是存储单元,是存储在内存中的空间,存储的是任务列表,要去做什么事情!这些任务交给CPU去做。CPU决定什么时候去做。

      线程是帮助CPU完成抢断式执行的基础数据类型,用来存储CPU每次执行未完成时需要保存的代码执行信息。(如:正在执行哪个方法?执行到第几行了?方法里的变量值为什么?)

    9,Thread类的一些重要成员

    • Start()启动线程
    • Abort()终止线程
    • Thread.Sleep(100)静态方法,可以让当前线程停止一段时间运行(毫秒)
    • Name线程名
    • Thread.CurrentThread获得当前线程的引用
    • 前台线程 和 后台线程

     10,多线程的消耗

      线程之间切换需要保存当前执行状态,以及读取切换前的执行状态,这个多线程的消耗。

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/Jeely/p/10754543.html
Copyright © 2011-2022 走看看