线程学习3——前台线程和后台线程
前台线程和后台线程
线程默认为前台线程,这意味着任何前台线程在运行都会保持程序存活。
后台线程:只要有一个前台线程在运行,应用程序的进程就在运行。如果多个前台线程在运行,而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枚举定义的值。
通常情况下,我们是不需要设置线程的优先级,或者将其设置成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下设的优先级到其他操作系统下可能一点用都没有。
建议不要随便提高线程的优先级,如果线程优先级过高可能会影响其他线程的执行,从而导致严重的、难以预料的、不堪设想的后果。