线程默认为前台线程,这意味着任何前台线程在运行都会保持程序存活。

     后台线程:只要有一个前台线程在运行,应用程序的进程就在运行。如果多个前台线程在运行,而Main()方法结束了,应用程序的进程就是激活的,直到所有前台线程完成其任务为止。
     前台线程和后台线程的唯一的区别是— 后台线程不会阻止进程终止。

     在默认情况下,用Thread 类创建的线程都是前台线程。线程池中的线程总是后台线程。

     在用Thread类创建线程时,可以设置属性IsBackground,以确定该线程是(false)前台线程还是(true)后台线程。

using System.Threading;

namespace ConsoleApplication1

{

class Program
   {
   static void myThread()
   {

   Console.WriteLine("新的线程开始输出消息");
       Console.ReadKey();
       Thread.Sleep(4000);//停止4秒中让主线程可以比NewThread提前结束


       Console.WriteLine("新的线程结束输出消息");
       Console.ReadKey();

}

static void Main(string[] args)

{
       Thread thread = new Thread(myThread);
       thread.Name = "NewThread";

   //IsBackground属性设置为false时 线程 NewThread是可以在主线程执行完毕后打印出两条消息的
       //IsBackground如果为true,则在主线程结束后,就打印不出第二条消息了 因为主线程(前台线程)结束了,后台线程也就跟着退出了。
       thread.IsBackground = false;
       thread.Start();

   Console.WriteLine("主线程已经结束");
   }
}
}

前台线程和后台线程适合的场合

      通常,后台线程非常适合于完成后台任务,应该将被动侦听活动的线程设置为后台线程,而将负责发送数据的线程设置为前台线程,这样,在所有的数据发送完毕之前该线程不会被终止。

      例如:如果关闭Word应用程序,拼写检查器继续运行器进程就没有意义了。在应用程序结束时,拼写检查器就可以关闭了。

线程的优先级

      在windows上执行的线程在执行了一定时间(一个时间片)后,windows将会进行“调度”,给线程指定优先级,可以影响这个调度。

      windows按照优先级的高低选择程序开始运行,也就是说如果存在一个优先级是25的线程能够执行,那么windows将不会调用优先级为24的线程。但是windows是一种“抢占式”的操作系

统(在windows上执行的线程能够在任何时候被抢占),如果一个具有较高优先级的线程准备好运行,并且当前运行的是较低优先级的线程,windows将迫使较低优先级线程停止运行,开始

运行较高优先级的线程。

      由于windows上线程调用是(笼统的讲)通过线程的优先级来实现的,那么如果我们想使我们的程序能够被尽量多的调度,就需要设置线程的优先级, 显卡

      在Thread类中,可以设置Priority属性,以影响线程的基本优先级。Priority属性需要一个ThreadPriority枚举定义的值。    
      Highest > AboveNormal >  Normal >  BelowNormal > Lowest

      通常情况下,我们是不需要设置线程的优先级,或者将其设置成Normal优先级。

using System.Threading;

namespace ConsoleApplication1
   {
       class Program
       {
           static bool loopSwitch = true;
           static void myThread()
           {
               long threadCount = 0;
               //进行加法操作
               while (loopSwitch) { threadCount++; }
               //显示结果
               Console.WriteLine("{0},优先级:{1}" + "数到:{2}",
               Thread.CurrentThread.Name,
               Thread.CurrentThread.Priority.ToString(),
               threadCount.ToString());
               Console.ReadLine();
           }

       static void Main(string[] args)
           {
               Thread threadOne = new Thread(myThread);
               threadOne.Name = "ThreadOne";

           Thread threadTwo = new Thread(myThread);
               threadTwo.Name = "ThreadTwo";
               threadTwo.Priority = ThreadPriority.Lowest;

           threadOne.Start();
               threadTwo.Start();
               Thread.Sleep(2000);
               loopSwitch = false;
           }
       }
   }

运行结果:

   threadTwo,优先级:Lowest数到:744795888
       threadOne,优先级:Normal数到: 745653704
       很显然线程优先级高的threadOne数的数要多一些,也就是说它执行的快一些。
       这里还要注意一个问题,线程的优先级还跟平台有关。不同的操作系统会对线程的调度不同,也就是说你在Windows下设的优先级到其他操作系统下可能一点用都没有。
       建议不要随便提高线程的优先级,如果线程优先级过高可能会影响其他线程的执行,从而导致严重的、难以预料的、不堪设想的后果。