一、進(jìn)程/線程
進(jìn)程:系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。(存資源)
線程:CPU調(diào)度和分派的基本單位。(執(zhí)行)
一個(gè)進(jìn)程可以有多個(gè)線程,一個(gè)線程可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。
場(chǎng)景:超市。

1 /// <summary> 2 /// 單線程 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 PRivate void button1_Click(object sender, EventArgs e) 7 { 8 //int sum = 0; 9 //for (int i = 1; i < 999999999; i++)10 //{11 // sum += i;12 //}13 //MessageBox.Show(sum.ToString());//執(zhí)行完后,才能做別的操作14 }15 16 /// <summary>17 /// 多線程18 /// </summary>19 /// <param name="sender"></param>20 /// <param name="e"></param>21 private void button3_Click(object sender, EventArgs e)22 {23 Thread thread = new Thread(TestThread);24 thread.IsBackground = true;//設(shè)置為后臺(tái)線程25 thread.Start();26 }27 28 /// <summary>29 /// 準(zhǔn)備讓線程去調(diào)用30 /// </summary>31 private void TestThread()32 {33 int sum = 0;34 for (int i = 1; i < 999999999; i++)35 {36 sum += i;37 }38 MessageBox.Show(sum.ToString());//執(zhí)行完后,才能做別的操作39 }View Code
二、前臺(tái)線程/后臺(tái)線程
1、進(jìn)程里面默認(rèn)的線程叫做主線程(UI線程).
2、默認(rèn)情況下,線程都是前臺(tái)線程(所有的線程執(zhí)行完畢后,程序才退出),如要將設(shè)置成后臺(tái)線程(關(guān)閉窗口后,程序就結(jié)束),設(shè)置thead.IsBackground=true.
三、線程重入以及解決方法
1、demo2中textbox是由ui線程創(chuàng)建的,所以創(chuàng)建的線程是沒法調(diào)用的,所以一開始程序會(huì)報(bào)錯(cuò), 只需要關(guān)閉控件的跨線程訪問的檢查即可.
2、多個(gè)線程訪問同一個(gè)資源,可能造成不同步的情況,叫做線程重入。用lock(this) 處理,this表示當(dāng)前對(duì)象,只能一個(gè)線程執(zhí)行完后,才能執(zhí)行另外的線程

1 public demo2() 2 { 3 InitializeComponent(); 4 TextBox.CheckForIllegalCrossThreadCalls = false;//關(guān)閉控件的跨線程訪問的檢查即可 5 } 6 Thread thread; 7 private void button1_Click(object sender, EventArgs e) 8 { 9 thread = new Thread(CountNum);10 thread.IsBackground = true;11 thread.Start();12 13 //Thread thread1 = new Thread(CountNum);14 //thread1.IsBackground = true;15 //thread1.Start();16 }17 private void CountNum()18 {19 lock (this)//this表示當(dāng)前對(duì)象,只能一個(gè)線程執(zhí)行完后,才能執(zhí)行另外的線程20 {21 for (int i = 0; i < 10000; i++)22 {23 int num = Convert.ToInt32(textBox1.Text.Trim());24 num++;25 //Thread.Sleep(1000);26 27 //if (num == 5000)28 //{29 // thread.Abort();30 //}31 textBox1.Text = num.ToString();32 }33 }34 }View Code四、線程的調(diào)度方式
1、非搶占式調(diào)度:某個(gè)線程在運(yùn)行時(shí)不會(huì)被操作系統(tǒng)強(qiáng)制暫停,運(yùn)行完后交出運(yùn)行權(quán)。一旦一個(gè)程序死了,那么整個(gè)電腦只能重啟了。
2、搶占式調(diào)度:每個(gè)線程都只有極少的運(yùn)行時(shí)間(在windows內(nèi)核模式下這個(gè)時(shí)間不會(huì)超過20ms),當(dāng)時(shí)間用完該線程會(huì)被強(qiáng)制暫停,保存上下文并把cpu運(yùn)行權(quán)交給下一個(gè)線程。
五、線程常用屬性方法
1、Abort方法:強(qiáng)行停掉線程。
2、Sleep(毫秒):將當(dāng)前線程暫停多少毫秒,靜態(tài)方法
六、抽獎(jiǎng)程序

1 public demo3() 2 { 3 InitializeComponent(); 4 Label.CheckForIllegalCrossThreadCalls = false; 5 } 6 Thread thead; 7 private void button1_Click(object sender, EventArgs e) 8 { 9 if (button1.Text == "開始搖獎(jiǎng)")10 {11 thead = new Thread(RunLuck);12 thead.IsBackground = true;13 thead.Start();14 button1.Text = "停止搖獎(jiǎng)";15 }16 else17 {18 thead.Abort();19 button1.Text = "開始搖獎(jiǎng)";20 }21 }22 Random r = new Random();23 public void RunLuck()24 {25 while (true)26 {27 Thread.Sleep(100);28 foreach (Control c in groupBox1.Controls)29 {30 Label lab = c as Label;31 if (lab != null)32 {33 lab.Text = r.Next(0, 10).ToString();34 }35 }36 }37 }View Code七、線程調(diào)用帶參數(shù)的方法

1 public demo4() 2 { 3 InitializeComponent(); 4 } 5 private void button1_Click(object sender, EventArgs e) 6 { 7 ParameterizedThreadStart s = new ParameterizedThreadStart(TestThreadParsms); 8 Thread t = new Thread(s); 9 t.IsBackground = true;10 t.Start("你好哇");11 }12 public void TestThreadParsms(object obj)//此處只能傳object類型參數(shù),和委托參數(shù)一致,如想傳多個(gè)參數(shù),弄成一個(gè)數(shù)組即可13 {14 MessageBox.Show(obj.ToString());15 }View Code------------------------------------------------------------------------------------------------------------------------------------------
軟謀在線教育,最適合大學(xué)生、上班族的在線軟件培訓(xùn),主要教授asp.net動(dòng)態(tài)網(wǎng)站制作,yy教育房間遠(yuǎn)程實(shí)時(shí)授課,每節(jié)課錄制成高清視頻課后分享,老師白天八小時(shí)全職在線輔導(dǎo),不懂就問。加QQ群:138800420 即可免費(fèi)試聽。

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注