一直以來對於多線程有種恐懼恐懼感,不理解它究竟是什麼回事,感受挺抽象的,自從聽了傳智播客的鄒老師對於多線程的講解,我能夠很自信地說我多線程方面入門了,特別是鄒老師對於多線程有一套獨有的方法,那就是畫圖,經過畫圖能夠很直觀地告訴你多線程是什麼回事,好比UI線程和主線程,前臺線程和後臺線程,經過案例的講解讓你發現多線程的美妙。如下簡單從如何建立多線程開始。首先來看用單線程的缺點:
經過對比單線程和多線程,建立了一個winform小程序來對比,界面以下:
進入代碼區:
首先創建一個循環999999999次的方法:
view plaincopy to clipboardprint?
01.///
02./// 循環計數的方法
03.///
04.void CountTime()
05.{
06. DateTime beginTime = DateTime.Now;
07. for (int i = 0; i <= 999999999; i++)
08. {
09.
10. }
11. TimeSpan ts = DateTime.Now.Subtract(beginTime);
12. MessageBox.Show("執行完畢!!"+ts.TotalMilliseconds);
13.}
///
/// 循環計數的方法
///
void CountTime()
{
DateTime beginTime = DateTime.Now;
for (int i = 0; i <= 999999999; i++)
{
}
TimeSpan ts = DateTime.Now.Subtract(beginTime);
MessageBox.Show("執行完畢!!"+ts.TotalMilliseconds);
}回到界面單擊「單線程的缺點」這個按鈕,編寫事件代碼以下:
view plaincopy to clipboardprint?
01.//單線程的缺點
02.private void btnSingleThread_Click(object sender, EventArgs e)
03.{
04. CountTime();
05.}
//單線程的缺點
private void btnSingleThread_Click(object sender, EventArgs e)
{
CountTime();
}
點擊運行,因爲不能演示看,你會看到你沒法拖動這個窗口移動搖晃,好像界面卡死了同樣,過了一下子,由於循環計數結束,彈出以下窗口:
2)那麼如何解決這種UI卡死的問題呢,由於以前單單用到單線程的而出現卡死的問題是由於界面運行的時候,其實主線程只能去處理計數,而根本沒有時間去處理你偶外的「拖動搖晃」這個事件,之道計數這個事情作完以後纔會過來作「拖動搖晃」的這個事件,爲了解決這個「假死」的事情,就要用到多線程技術,點擊界面的「多線程」按鈕,以下代碼:
view plaincopy to clipboardprint?
01. //使用多線程來解決UI卡死問題
02. private void btnMulTread_Click(object sender, EventArgs e)
03. {
04. //ThreadStart ts = new ThreadStart(CountTime);
05. //Thread th = new Thread(ts);
06. //建立線程對象 傳入要線程執行的方法
07. Thread th = new Thread(CountTime);
08. //將線程設置爲後臺線程(當全部的前臺線程結束後,後臺線程會自動退出)
09. th.IsBackground = true;
10. //啓動線程執行方法
11. th.Start();
12.
13.
14. }
//使用多線程來解決UI卡死問題
private void btnMulTread_Click(object sender, EventArgs e)
{
//ThreadStart ts = new ThreadStart(CountTime);
//Thread th = new Thread(ts);
//建立線程對象 傳入要線程執行的方法
Thread th = new Thread(CountTime);
//將線程設置爲後臺線程(當全部的前臺線程結束後,後臺線程會自動退出)
th.IsBackground = true;
//啓動線程執行方法
th.Start();
}
這樣點擊運行並點擊「多線程」按鈕來執行的話,你會發現運行過程當中你能夠拖動窗口,很是流暢地拖動着走,直到運行結束彈出以下消息窗口:
![null](http://static.javashuo.com/static/loading.gif)
細心的你可能會發現上面兩個執行時間不同,單線程用的時間比多線程用的少那麼一點點,緣由是由於CPU要來回轉過去執行UI線程和計數線程,其實多線程的實際上不是同時執行,只是由於CPU處理速度太快了,能夠很是快速地來回在各個線程之間切換執行,就好像咱們先燒開水,而後不用去等開水開了就能夠去洗衣服同樣,由於CPU處理的速度太快了,咱們人裸眼根本察覺不到它在各個線程之間不停地切換,感受好像是同時運行同樣。自從終於能夠對多線程有一個入門的認識了。