线程学习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下設的優先級到其他操作系統下可能一點用都沒有。
??????? 建議不要隨便提高線程的優先級,如果線程優先級過高可能會影響其他線程的執行,從而導致嚴重的、難以預料的、不堪設想的后果。
轉載于:https://www.cnblogs.com/jiajiayuan/archive/2011/05/31/2064059.html
總結
以上是生活随笔為你收集整理的线程学习3——前台线程和后台线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Outlook Express 自動回信
- 下一篇: iphone-常用的对视图图层(laye