多线程原来是这么简单
一直以來對于多線程有種恐懼恐懼感,不理解它到底是什么回事,感覺挺抽象的,自從聽了傳智播客的鄒老師對于多線程的講解,我可以很自信地說我多線程方面入門了,特別是鄒老師對于多線程有一套獨有的方法,那就是畫圖,通過畫圖可以很直觀地告訴你多線程是什么回事,比如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();
}
這樣點擊運行并點擊“多線程”按鈕來執行的話,你會發現運行過程中你可以拖動窗口,非常流暢地拖動著走,直到運行結束彈出如下消息窗口:
細心的你可能會發現上面兩個執行時間不一樣,單線程用的時間比多線程用的少那么一點點,原因是因為CPU要來回轉過去執行UI線程和計數線程,其實多線程的實際上不是同時執行,只是因為CPU處理速度太快了,可以非常快速地來回在各個線程之間切換執行,就好像我們先燒開水,然后不用去等開水開了就可以去洗衣服一樣,因為CPU處理的速度太快了,我們人裸眼根本察覺不到它在各個線程之間不停地切換,感覺好像是同時運行一樣。自從終于可以對多線程有一個入門的認識了。
總結
以上是生活随笔為你收集整理的多线程原来是这么简单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用C语言清空特定文件夹中的所有文件
- 下一篇: AIX 下磁盘 I/O 性能分析