認識線程 因為新啟動的線程里會休息一下,所以肯定是主線程的方法先執行, 如果想讓新啟動的線程執行完再去執行主線,也就是讓主線程等待,可以用 join 有時候覺得新啟動的線程有點不聽話,乾脆幹掉吧,讓它活一會已經夠意思了,可以用Abort,但是這個容易出問題,不建議使用。 線程是有前後之分的,預設顯示 ...
認識線程
public static void Print() { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); Console.WriteLine(i); } } public static void Print1() { for (int i = 0; i < 10; i++) { Console.WriteLine("i am first thread " + i); } }
Console.WriteLine("Starting------------"); Thread t = new Thread(Print); t.Start(); Print1(); Console.ReadKey();
因為新啟動的線程里會休息一下,所以肯定是主線程的方法先執行,
如果想讓新啟動的線程執行完再去執行主線,也就是讓主線程等待,可以用 join
Console.WriteLine("Starting------------"); Thread t = new Thread(Print); t.Start(); t.Join(); //阻塞後面的線程,一直等到它完成。 Print1(); Console.ReadKey();
有時候覺得新啟動的線程有點不聽話,乾脆幹掉吧,讓它活一會已經夠意思了,可以用Abort,但是這個容易出問題,不建議使用。
Console.WriteLine("Starting------------"); Thread t = new Thread(Print); t.Start(); Thread.Sleep(5000); t.Abort();//幹掉線程,容易引發異常,不建議使用 Print1(); Console.ReadKey();
線程是有前後之分的,預設顯示創建的線程都是前臺線程,而進程會等待所有的前臺線程結束後自動關閉程式,不管後臺線程的死活,不過如果程式定義了一個永遠不會執行完的線程那麼就可以等待後臺線程執行完了,比如 Console.ReadKey(),是吧,哈哈
Console.WriteLine("Starting------------"); Thread t = new Thread(Print); t.Start(); t.IsBackground = true; Print1(); //Console.ReadKey();
把新啟動的線程設置為後臺線程之後,如果最後一下不註釋的話,那麼前後線程都會執行完,如果註釋的話,那麼主線程執行完直接就結束程式了。
如果調用的方法里想傳遞參數呢,不用著急有2中方法。
1、
public static void Print3(string name) { for (int i = 0; i < 10; i++) { Console.WriteLine(name + "========================" + i); } }
Console.WriteLine("Starting------------"); Thread t = new Thread(() => { Print3("i am"); }); t.Start(); Console.ReadKey();
2、
public static void Print4(object name) { for (int i = 0; i < 10; i++) { Console.WriteLine(name + "========================" + i); } }
Console.WriteLine("Starting------------"); Thread t = new Thread(new ParameterizedThreadStart(Print4)); t.Start("i am "); Console.ReadKey();
註意2中帶參數的方式,第二種比較特殊,要求方法參數必須是object的,要註意。
異常處理的話,一般是線上程里進行try-catch,如果是線上程外面 try-catch的話,將失效,即 報錯。