總結(jié)C#多線程的點(diǎn)點(diǎn)滴滴
一、C#多線程相關(guān)的基本概念
進(jìn)程:當(dāng)一個(gè)程序開(kāi)始運(yùn)行時(shí),它就是一個(gè)進(jìn)程,進(jìn)程包括運(yùn)行中的程序和程序所使用到的內(nèi)存和系統(tǒng)資源。而一個(gè)進(jìn)程又是由多個(gè)線程所組成的。
線程:線程是程序中的一個(gè)執(zhí)行流,每個(gè)線程都有自己的專有寄存器(棧指針、程序計(jì)數(shù)器等),但代碼區(qū)是共享的,即不同的線程可以執(zhí)行同樣的函數(shù)。
多線程:多線程是指程序中包含多個(gè)執(zhí)行流,即在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來(lái)執(zhí)行不同的任務(wù),也就是說(shuō)允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線程來(lái)完成各自的任務(wù)。
靜態(tài)屬性:這個(gè)類所有對(duì)象所公有的屬性,不管你創(chuàng)建了多少個(gè)這個(gè)類的實(shí)例,但是類的靜態(tài)屬性在內(nèi)存中只有一個(gè)。
二、C#多線程的優(yōu)劣
優(yōu)點(diǎn):可以提高CPU的利用率。在多線程程序中,一個(gè)線程必須等待的時(shí)候,CPU可以運(yùn)行其它的線程而不是等待,這樣就大大提高了程序的效率。
缺點(diǎn):線程也是程序,所以線程需要占用內(nèi)存,線程越多占用內(nèi)存也越多;
多線程需要協(xié)調(diào)和管理,所以需要CPU時(shí)間跟蹤線程;
線程之間對(duì)共享資源的訪問(wèn)會(huì)相互影響,必須解決競(jìng)用共享資源的問(wèn)題;
線程太多會(huì)導(dǎo)致控制太復(fù)雜,最終可能造成很多Bug;
三、控制線程的類和方法
類:using System.Threading; Thread類
Thread類的方法:Start():?jiǎn)?dòng)線程;
Sleep(int):靜態(tài)方法,暫停當(dāng)前線程指定的毫秒數(shù);
Abort():通常使用該方法來(lái)終止一個(gè)線程;
Suspend():該方法并不終止未完成的線程,它僅僅掛起線程,以后還可恢復(fù);
Resume():恢復(fù)被Suspend()方法掛起的線程的執(zhí)行。
四、如何操縱一個(gè)線程
- using System;
- using System.Threading;
- namespace ThreadTest
- {
- public class Alpha
- {
- public void Beta()
- {
- while (true)
- {
- Console.WriteLine("Alpha.Beta is running in its own thread.");
- }
- }
- }
- public class Simple
- {
- public static int Main()
- {
- Console.WriteLine("Thread Start/Stop/Join Sample");
- Alpha oAlpha = new Alpha();
- //這里創(chuàng)建一個(gè)線程,使之執(zhí)行Alpha類的Beta()方法
- Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
- oThread.Start(); // 程序運(yùn)行的是Alpha.Beta()方法
- while (!oThread.IsAlive)
- Thread.Sleep(1); //讓主線程停1ms
- oThread.Abort(); //終止線程oThread
- oThread.Join(); //使主線程等待,直到oThread線程結(jié)束??梢灾付ㄒ粋€(gè)int型的參數(shù)作為等待的最長(zhǎng)時(shí)間
- Console.WriteLine();
- Console.WriteLine("Alpha.Beta has finished");
- try
- {
- Console.WriteLine("Try to restart the Alpha.Beta thread");
- oThread.Start();
- }
- catch (ThreadStateException)
- {
- Console.Write("ThreadStateException trying to restart Alpha.Beta. ");
- Console.WriteLine("Expected since aborted threads cannot be restarted."); Console.ReadLine();
- }
- return 0;
- }
- }
- }
五、Thread.ThreadState 屬性
Aborted:線程已停止;
AbortRequested:線程的Thread.Abort()方法已被調(diào)用,但是線程還未停止;
Background:線程在后臺(tái)執(zhí)行,與屬性Thread.IsBackground有關(guān);不妨礙程序的終止
Running:線程正在正常運(yùn)行;
Stopped:線程已經(jīng)被停止;
StopRequested:線程正在被要求停止;
Suspended:線程已經(jīng)被掛起(此狀態(tài)下,可以通過(guò)調(diào)用Resume()方法重新運(yùn)行);
SuspendRequested:線程正在要求被掛起,但是未來(lái)得及響應(yīng);
Unstarted:未調(diào)用Thread.Start()開(kāi)始線程的運(yùn)行;
WaitSleepJoin:線程因?yàn)檎{(diào)用了Wait(),Sleep()或Join()等方法處于封鎖狀態(tài);
六、C#多線程的優(yōu)先級(jí)
由高到低分別是Highest,AboveNormal,Normal,BelowNormal,Lowest;系統(tǒng)默認(rèn)為T(mén)hreadPriority.Normal
指定優(yōu)先級(jí)的代碼:myThread.Priority=ThreadPriority.Lowest;
【編輯推薦】