1.線程基礎(chǔ) -《多線程編程實(shí)戰(zhàn)》

1.線程基礎(chǔ) -《多線程編程實(shí)戰(zhàn)》
線程的生命周期濒翻,包括創(chuàng)建線程、掛起線程、線程等待有送,以及中止線程淌喻。

1.2 創(chuàng)建線程

    class Program
    {
        static void Main(string[] args)
        {
            
            Thread t = new Thread(PrintNumbers);
            t.Start();
            PrintNumbers();

            Console.Read();
        }

        static void PrintNumbers()
        {
            Console.WriteLine("開始...");
            for (int i = 1; i < 50; i++)
            {
                Console.WriteLine(i);
            }
        }
    }
1.2 創(chuàng)建線程

正在執(zhí)行中的程序?qū)嵗杀环Q為一個(gè)進(jìn)程。進(jìn)程由一個(gè)或多個(gè)線程組成雀摘。這意味著當(dāng)運(yùn)行程序時(shí)裸删,始終有一個(gè)執(zhí)行程序代碼的是主線程。

結(jié)果兩組范圍為1到50的數(shù)字會(huì)隨機(jī)交叉輸出阵赠,說明 PrintNumbers 方法同時(shí)運(yùn)行在主線程和另一個(gè)線程中涯塔。

1.3 暫停線程(Thread.Sleep)

本節(jié)展示讓一個(gè)線程等待一段時(shí)間,而不用消耗操作系統(tǒng)資源豌注。

        static void Main(string[] args)
        {
            Thread t = new Thread(PrintNumbersWithDelay);
            t.Start();
            PrintNumbers();
            Console.Read();
        }

        static void PrintNumbers()
        {
            Console.WriteLine("PrintNumbers開始...");
            for (int i = 1; i < 10; i++)
            {
                Console.WriteLine(i);
            }
        }

        static void PrintNumbersWithDelay()
        {
            Console.WriteLine("PrintNumbersWithDelay開始...");
            for (int i = 1; i < 10; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Console.WriteLine("多線程:" + i);
            }
        }

1.3 暫停線程

當(dāng)程序運(yùn)行時(shí)伤塌,會(huì)創(chuàng)建一個(gè)線程執(zhí)行 PrintNumbersWithDelay 方法。然后立即執(zhí)行 PrintNumbers 轧铁。PrintNumbersWithDelay 加入了 Thread.Sleep (休眠)2秒每聪。當(dāng)線程休眠狀態(tài)時(shí),會(huì)盡可能少的 CPU 時(shí)間齿风。結(jié)果發(fā)現(xiàn) PrintNumbers 先執(zhí)行完药薯。

1.4 線程等待(Thread.Join)#

本節(jié)展示如何讓程序等待另一個(gè)線程中的計(jì)算完成,然后在代碼中使用該線程的計(jì)算結(jié)果救斑。使用 Thread.Sleep 行不通童本,因?yàn)椴⒉恢缊?zhí)行計(jì)算需要花費(fèi)的具體時(shí)間。

        static void Main(string[] args)
        {
            Console.WriteLine("主線程開始...");
            Thread t = new Thread(PrintNumbersWithDelay);
            t.Start();
            t.Join();
            Console.WriteLine("Thread completed");
            Console.Read();
        }

        static void PrintNumbersWithDelay()
        {
            Console.WriteLine("PrintNumbersWithDelay開始...");
            for (int i = 1; i < 10; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Console.WriteLine("多線程:" + i);
            }
        }

1.4 線程等待(Thread.Join)

當(dāng)程序啟動(dòng)一個(gè)耗時(shí)較長的線程來打印數(shù)字脸候,打印每個(gè)數(shù)字前要等待2秒穷娱。但我們主程序調(diào)用了 t.Join 方法,該方法允許我們等待指導(dǎo)線程 t 完成运沦。當(dāng)線程完成時(shí)泵额,主程序會(huì)繼續(xù)運(yùn)行。

借助該技術(shù)可以實(shí)現(xiàn)兩個(gè)線程間的同步執(zhí)行步驟携添。第一個(gè)線程會(huì)等待另一個(gè)線程完成后再繼續(xù)執(zhí)行嫁盲。第一個(gè)線程等待時(shí),是處于阻塞狀態(tài)烈掠。

1.5 終止線程(Thread.Abort)#

        static void Main(string[] args)
        {
            Console.WriteLine("開始程序..");
            Thread t = new Thread(PrintNumbersWithDelay);
            t.Start();
            Thread.Sleep(TimeSpan.FromSeconds(6));
            t.Abort();
            Console.WriteLine("一個(gè)線程終止了~~");
             t = new Thread(PrintNumbers);
            t.Start();
            PrintNumbers();
            Console.Read();
        }
        static void PrintNumbersWithDelay()
        {
            Console.WriteLine("PrintNumbersWithDelay開始...");
            for (int i = 1; i < 10; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Console.WriteLine("多線程:" + i +"羞秤,當(dāng)前線程:"+ Thread.CurrentThread.ManagedThreadId);
            }
        }

        static void PrintNumbers()
        {
            Console.WriteLine("PrintNumbers 開始...");
            for (int i = 1; i < 10; i++)
            {
                Console.WriteLine(i + ",當(dāng)前線程:" + Thread.CurrentThread.ManagedThreadId);
            }
        }

1.5 終止線程

當(dāng)主程序和單獨(dú)的數(shù)字打印線程運(yùn)行時(shí)左敌,等待6秒調(diào)用t.Abort方法瘾蛋。這給線程注入 ThreadAbortException 方法,導(dǎo)致線程被終止矫限。
使用該技術(shù)不一定能終止線程瘦黑。目標(biāo)線程可以通過處理該異常并調(diào)用Thread.ResetAbort方法來拒絕被終止京革。因此不推薦使用Abort方法關(guān)閉線程⌒页猓可以使用其他方法匹摇,比如提供一個(gè)CancellationToken方法來取消線程執(zhí)行。

1.6 檢測線程狀態(tài)(Thread.CurrentThread)#

public enum ThreadState
{
    Running = 0,            //線程已啟動(dòng)甲葬,它未被阻塞廊勃,并且沒有掛起的
    StopRequested = 1,      //正在請求線程停止。 這僅用于內(nèi)部
    SuspendRequested = 2,   //正在請求線程掛起
    Background = 4,         //線程正作為后臺線程執(zhí)行(相對于前臺線程而言)通過設(shè)置Thread.IsBackground來控制
    Unstarted = 8,          //尚未對線程調(diào)用 Thread.Start() 方法
    Stopped = 16,           //線程已停止
    WaitSleepJoin = 32,     //線程已被阻止经窖。Thread.Sleep 或 Thread.Join()坡垫、請求鎖定或等待線程同步對象
    Suspended = 64,         //線程已掛起
    AbortRequested = 128,   //已對線程調(diào)用了 Thread.Abort 方法,但線程尚未收到試圖終止它的掛起的
    Aborted = 256,          //程狀態(tài)包括ThreadState.AbortRequested并且該線程現(xiàn)在已死画侣,但其狀態(tài)尚未更改為ThreadState.Stopped
}

下面看示例:

        static void Main(string[] args)
        {
            Console.WriteLine("開始程序冰悠。。");
            Thread t = new Thread(PrintNumbersWithStatus);
            Thread t2 = new Thread(DoNothing);

            Console.WriteLine("t的線程狀態(tài):" + t.ThreadState.ToString() + "配乱,t線程:" + t.ManagedThreadId);
            t2.Start();
            t.Start();
            for (int i = 1; i < 30; i++)
            {
                Console.WriteLine("t的線程狀態(tài):" + t.ThreadState.ToString() + "溉卓,t線程:" + t.ManagedThreadId);
            }

            Thread.Sleep(TimeSpan.FromSeconds(6));
            t.Abort();
            Console.WriteLine("一個(gè)線程終止了~~");

            Console.WriteLine("t的線程狀態(tài):" + t.ThreadState.ToString() + ",t線程:" + t.ManagedThreadId);
            Console.WriteLine("t2的線程狀態(tài):" + t2.ThreadState.ToString() + "搬泥,t2線程:" + t2.ManagedThreadId);
            Console.Read();
        }

        static void DoNothing()
        {
            Console.WriteLine("DoNothing開始...");
            Thread.Sleep(TimeSpan.FromSeconds(2));
        }

        static void PrintNumbersWithStatus()
        {
            Console.WriteLine("PrintNumbersWithStatus開始...");
            Console.WriteLine("當(dāng)前線程狀態(tài):" + Thread.CurrentThread.ThreadState.ToString() + "桑寨,當(dāng)前線程:" + Thread.CurrentThread.ManagedThreadId);
            for (int i = 1; i < 10; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                Console.WriteLine("多線程:" + i + ",當(dāng)前線程:" + Thread.CurrentThread.ManagedThreadId);
            }
        }
1.6 檢測線程狀態(tài)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忿檩,一起剝皮案震驚了整個(gè)濱河市尉尾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燥透,老刑警劉巖沙咏,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異班套,居然都是意外死亡肢藐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門孽尽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窖壕,“玉大人忧勿,你說我怎么就攤上這事杉女。” “怎么了鸳吸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵熏挎,是天一觀的道長。 經(jīng)常有香客問我晌砾,道長坎拐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮哼勇,結(jié)果婚禮上都伪,老公的妹妹穿的比我還像新娘。我一直安慰自己积担,他們只是感情好陨晶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帝璧,像睡著了一般先誉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上的烁,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天褐耳,我揣著相機(jī)與錄音,去河邊找鬼渴庆。 笑死铃芦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的把曼。 我是一名探鬼主播杨帽,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗤军!你這毒婦竟也來了注盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤叙赚,失蹤者是張志新(化名)和其女友劉穎老客,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體震叮,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胧砰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苇瓣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尉间。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖击罪,靈堂內(nèi)的尸體忽然破棺而出哲嘲,到底是詐尸還是另有隱情,我是刑警寧澤媳禁,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布眠副,位于F島的核電站,受9級特大地震影響竣稽,放射性物質(zhì)發(fā)生泄漏囱怕。R本人自食惡果不足惜霍弹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娃弓。 院中可真熱鬧典格,春花似錦、人聲如沸台丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐佳。三九已至私恬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炼吴,已是汗流浹背本鸣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硅蹦,地道東北人荣德。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像童芹,于是被迫代替她去往敵國和親涮瞻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容