1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 线程学习3——前台线程和后台线程

线程学习3——前台线程和后台线程

时间:2021-04-30 08:21:09

相关推荐

线程学习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枚举定义的值。

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下设的优先级到其他操作系统下可能一点用都没有。

建议不要随便提高线程的优先级,如果线程优先级过高可能会影响其他线程的执行,从而导致严重的、难以预料的、不堪设想的后果。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。