英文意思:
什麼是多線程?
比如你需要建房子,如果使用單線程,房子的門,地闆,水管等都是你一個人安裝,這樣效率特别的低 總知就是 “終究還是一個人扛下了所有”。
但是在開一個線程就可以把你一部分工作分給另一人(另一個線程)做,這樣就不會導緻你累死了(程式的假死)
例圖:
CPU執行方式
單核CPU:
如果在單核CPU運作多線程程式,那麼他将線上程中來回切換速度非常的快,感覺不出來
多核CPU:
在多核CPU運作多線程,才是真正的多線程,同時執行
下面以例子介紹他的使用方法
執行個體
命名空間
using System.Threading;
建立一個窗體應用程式
寫一個方法
void a() {
for (int i = 0; i <= 1000000; i++){
textBox1.Text = i.ToString();
}
}
按鈕裡調用
a();//調用方法
運作點選按鈕,程式卡死一段時間,這是因為循環在主線程未結束造成的,
但是建立一個線程讓他執行程式就不會卡死,把之前的調用删除
按鈕裡建立線程
Thread th = new Thread(a);
//建立一個線程,執行方法a的代碼
th.Start();
//告訴CPU可以執行這個線程了
運作的時候跳異常了 ,這是因為“胯線程”了
跨線程的解決方法
之是以出異常是因為建立的“線程”去通路了“textBox1.Text”
而“textBox1.Text"文本框的控件是在主線程中建立的
解決方法:
在窗體加載的時禁止”跨線程“的檢測
CheckForIllegalCrossThreadCalls = false;
//寫在窗體下
這樣就可以運作了
但是運作的速度非常的快,一秒鐘就到大幾千了,給他加一個時間間隔
線程的間隔時間
Thread.Sleep(1000);
//間隔1秒 機關:毫秒
這樣一秒鐘就加一個數字了
程式已經關閉了,為什麼Vs中還顯示在運作?
因為程式的線程在前台,程式關閉後線程還在繼續執行,直到運作完,如果是個死循環那麼将不會結束
解決方法:
Thread th = new Thread(a);
//建立一個線程,執行方法a的代碼
th.IsBackground = true;
//在背景執行
th.Start();
//告訴CPU可以執行這個線程了
前台線程與背景線程
前台線程(預設):程式關閉但線程還在執行,程式還沒真正的關閉,直到代碼運作完才關閉,關閉了但還沒完全關閉
背景線程:程式關閉後,線程也一起關閉
th.IsBackground = true;
//設定成背景線程
這個例子就結束了!!
線程間參數的傳遞
這是一個方法體,傳遞參數到a1 a2 上
static int a (int a1,int a2) {
int b = a1 + a2;
Console.Write(b);
}
傳遞方式1(建議使用):
Thread th = new Thread(()=>a(1,1));
//建立一個線程,傳遞兩個 1 的參數
th.Start();
//開始線程
===============================
傳遞方式2(單參數)
方法類型必須是 object 類型的 否則無法傳遞,而且隻能單個參數,必須得類型轉換
建立方法:
static void a (object a1) {
int b = Convert.ToInt32(a1);
Console.Write(b);
}
傳遞參數:
Thread th = new Thread(a);
//建立一個線程
th.Start(“1”);
//開始線程
線程命名
這個好像沒什麼用…
Thread.CurrentThread.Name = “馬冬梅”;
//給目前線程命名(主線程)
Console.WriteLine(Thread.CurrentThread.Name);
//輸出主線程的名字
Thread th = new Thread(a);
//建立一個線程
th.Name = “小馬哥的棺材”;
//給建立的線程命名
static void a () { Console.WriteLine(Thread.CurrentThread.Name); 輸出目前線程名 "小馬哥的棺材" }
運作結果:
等待線程執行完後在執行
編寫程式中需要等一個線程執行完後在繼續執行下面的語句,例如加載一些東西等
th.Join(); //等待這個線程執行完
Thread th = new Thread(a);
//建立一個線程
th.Start(); //開始線程
th.Join(); //等待這個線程執行完
Console.Write(“小馬哥的棺材闆”);
static void a() { Console.WriteLine("線程在執行"); Thread.Sleep(3000); //線程間隔3秒 }
使用這個方法需要等待這個線程執行完成後才會繼續執行後面的代碼
純手打,點個贊呗~