A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mzh901024 中级黑马   /  2013-8-3 19:08  /  1186 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程之间争夺CPU时间时,CPU 是怎么给予服务的,还有用ABORT()终止线程有什么不好的地方

2 个回复

倒序浏览
本帖最后由 sxdxgzr@126.com 于 2013-8-3 20:22 编辑

    1.NET线程优先级:是指定一个线程的相对于其他线程的相对优先级,它规定了线程的执行顺序,对于在CLR中创建的线程,其优先级别默认为Normal,而在CLR之外创建的线程进入CLR时,将会保留其先前的优先级,可以通过访问线程的Priority属性来获取或设置线程的优先级别。System.Threading命名空间中的ThreadPriority枚举定义了一组线程优先级的所有可能值,我这里按级别由高到低排列出来,具体的说明就不在这里解释。 Highest  , AboveNormal ,  Normal  ,  BelowNormal ,  Lowest。
    2线程调度:无论线程是否运行于CLR中,线程执行时间片是有操作系统进行分配的,线程是严格按照其优先级来调度执行的,调度算法来确定线程的执行顺序,不同的操作系统可能又不同的调度算法。具有最高优先级别的线程经过调度后总是首先运行,只要具有较高优先级别的线程可以运行,较低级别的所有线程就必须等待。如果具有相同优先级的多个线程都可以运行,那么调度程序将遍历处于该优先级的所有线程,并为每个线程提供一个固定的执行时间片,因此同一优先级的线程很多时候都是交替执行的。如果具有较高优先级的线程可以运行,较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行,如果在给定的优先级上不再有可运行的线程,则调度程序将转移到下一个低级别的优先级,并在该优先级上调度线程。
      3如:
  1. using System;
  2. using System.Threading;

  3. namespace Thread2
  4. {
  5.     class Test
  6.     {
  7.         public static void Main()
  8.         {

  9.             //线程threadA 优先级默认为nomal
  10.             var threadA = new Thread(delegate()
  11.             {   
  12.                 for (int i = 0; i < 20; i++)
  13.                 {
  14.                     Console.Write("A");
  15.                 }
  16.             });

  17.             //线程B   优先级为Highest
  18.             var threadB = new Thread(delegate()
  19.             {  //线程threadB
  20.                 for (int i = 0; i < 20; i++)
  21.                 {
  22.                     Console.Write("B");
  23.                 }
  24.             }){Priority = ThreadPriority.Highest};



  25.             //线程threadC 优先级为BelowNormal
  26.             var threadC = new Thread(delegate()
  27.             {   
  28.                 for (int i = 0; i < 20; i++)
  29.                 {
  30.                     Console.Write("C");
  31.                 }
  32.             }) {Priority = ThreadPriority.BelowNormal};


  33.             //线程threadD 优先级为AboveNormal
  34.             var threadD = new Thread(delegate()
  35.             {   
  36.                 for (int i = 0; i < 20; i++)
  37.                 {
  38.                     Console.Write("D");
  39.                 }
  40.             }) {Priority = ThreadPriority.AboveNormal};

  41.             //启动线程
  42.             threadB.Start();
  43.             threadD.Start();
  44.             threadA.Start();
  45.             threadC.Start();


  46.             Console.ReadKey();
  47.         }
  48.     }
  49. }
复制代码
由于设置线程调度优先级threadB>threadD>threadA>threadC,且线程按优先级启动时的执行结果:线程优先级高的先执行完,优先级低的后执行完。可以运行代码试试。

     4
回复 使用道具 举报
关于CPU等系统资源的分配是操作系统的问题啦,操作系统对于CPU的分配有很多相关的复杂算法,建议你学习一下操作系统课程!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马