C#多線程總結
1、 首先多線程啓動必須包含using System.Threading;這個頭文件。必須使用Thread這個類。
Thread 這個類有如下常用的屬性:
對於Thread類更多:
https://msdn.microsoft.com/zh-cn/library/system.threading.thread%28v=vs.110%29.aspx
IsAlive |
指示線程的當前狀態(true|false) |
IsBackground |
指示線程是否爲後臺線程 |
Name |
獲取或設置線程的名字(線程默認爲前臺線程) |
Priority |
獲取設置線程的優先級(其中屬性值爲枚舉類型enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }) |
任何線程創建範圍內try/catch/finally塊,當線程開始執行便不再與其有任何關係。
2、線程用Thread類來創建, 通過ThreadStart委託來指明方法從哪裏開始運行,下面是ThreadStart委託如何定義的:
public delegate voidThreadStart();
3、啓動線程的方法:有三種。
第一種:使用委託來調用要執行的函數。
//ThreadStart委託不支持傳入參數
public static void Test1()
{
Thread t = new Thread(new ThreadStart(Go));
t.Start();
Go();
}
public static void Go()
{
Console.WriteLine(i++);
}
第二種:直接把要調用的函數放在線程中,然後啓動。
public static void Test2()
{
Thread t = new Thread(Go);
t.Start();
}
第三種:如果線程的函數比較簡單可以直接寫在匿名委託裏。
public static void Test3()
{
Thread t = new Thread(delegate() { Console.WriteLine(i++); });
t.Start();
}
4、.NET framework定義了另一個版本的委託叫做ParameterizedThreadStart,它可以接收一個單獨的object類型參數,而且這個方法的參數必須是object類型的。ParameterizedThreadStart的特性是在使用之前我們必需對我們想要的類型(這裏是bool)進行裝箱操作,並且它只能接收一個參數。 一個替代方案是使用一個匿名方法調用一個普通的方法
publicdelegate void ParameterizedThreadStart (object obj);
publicstatic void Test4()
{
Thread t = new Thread(newParameterizedThreadStart(Go1));
t.Start(true);
t.Priority=ThreadPriority.
Go1(false);
}
publicstatic void Go1(object b)
{
bool b1=(bool)b;
Console.WriteLine(b1?"HELLO":"hello");
}
、C# Thread類:判斷多個線程是否都結束的兩種方法
5、確定所有線程是否都完成了工作的方法有很多,如可以採用類似於對象計數器的方法,所謂對象計數器,就是一個對象被引用一次,這個計數器就加1,銷燬引用就減1,如果引用數爲0,則垃圾蒐集器就會對這些引用數爲0的對象進行回收。
方法一:線程計數器
線程也可以採用計數器的方法,即爲所有需要監視的線程設一個線程計數器,每開始一個線程,在線程的執行方法中爲這個計數器加1,如果某個線程結束(在線程執行方法的最後爲這個計數器減1),爲這個計數器減1。然後再開始一個線程,按着一定的時間間隔來監視這個計數器,如是棕個計數器爲0,說明所有的線程都結束了。當然,也可以不用這個監視線程,而在每一個工作線程的最後(在爲計數器減1的代碼的後面)來監視這個計數器,也就是說,每一個工作線程在退出之前,還要負責檢測這個計數器。使用這種方法不要忘了同步這個計數器變量啊,否則會產生意想不到的後果。
方法二:使用Thread.join方法
join方法只有在線程結束時才繼續執行下面的語句。可以對每一個線程調用它的join方法,但要注意,這個調用要在另一個線程裏,而不要在主線程,否則程序會被阻塞的。實例:
private static void threadMethod(Objectobj)
{
Thread.Sleep(Int32.Parse(obj.ToString()));
Console.WriteLine(obj + "毫秒任務結束");
}
private static void joinAllThread(objectobj)
{
Thread[] threads = obj asThread[];
foreach (Thread t in threads)
t.Join();
Console.WriteLine("所有的線程結束");
}
static void Main(string[] args)
{
Thread thread1 = newThread(threadMethod);
Thread thread2 = newThread(threadMethod);
Thread thread3 = new Thread(threadMethod);
thread1.Start(3000);
thread2.Start(5000);
thread3.Start(7000);
Thread joinThread = newThread(joinAllThread);
joinThread.Start(new Thread[] {thread1, thread2, thread3 });
}