多線程的相關概念
--------------------------------------------------------------------------------
1.進程:是操作系統結構的基礎;是一個正在執行的程序;計算機中正在運行的程序實例;可以分配給處理器并由處理器執行的一個實體;由單一順序的執行顯示,一個當前狀態和一組相關的系統資源所描述的活動單元。
2.線程:線程是程序中一個單一的順序控制流程。是程序執行流的最小單元。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
3.多線程:在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
--------------------------------------------------------------------------------
小結:其實更容易理解一點進程與線程的話,可以舉這樣一個例子:把進程理解成為一個運營著的公司,然而每一個公司員工就可以叫做一個進程。每個公司至少要有一個員工,員工越多,如果你的管理合理的話,公司的運營速度就會越好。這里官味一點話就是說。cpu大部分時間處于空閑時間,浪費了cpu資源,多線程可以讓一個程序“同時”處理多個事情,提高效率。
--------------------------------------------------------------------------------
單線程問題演示
--------------------------------------------------------------------------------
創建一個WinForm應用程序,這里出現的問題是,點擊按鈕后如果在彈出提示框之前,窗體是不能被拖動的。
解決辦法:使用多線程,我們自己創建線程。把計算代碼放入我們自己寫的線程中,UI線程就能繼續做他的界面響應了。
--------------------------------------------------------------------------------
線程的創建
--------------------------------------------------------------------------------
線程的實現:線程一定是要執行一段代碼的,所以要產生一個線程,必須先為該線程寫一個方法,這個方法中的代碼,就是該線程中要執行的代碼,然而啟動線程時,是通過委托調用該方法的。線程啟動是,調用傳過來的委托,委托就會執行相應的方法,從而實現線程執行方法。
所以多個線程同時執行一個方法的情況是存在的,然而這里不經過處理的話會出現一點問題,線程之間先后爭搶資源,致使數據計算結果錯亂。
//設置TextBox類的這個屬性是因為,開啟ui線程,
//微軟設置檢測不允許其它線程對ui線程的數據進行訪問,這里我們把檢測關閉,也就允許了其它線程對ui線程數據的訪問。
//如果檢測不設置為False,則報錯。
TextBox.CheckForIllegalCrossThreadCalls = false;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "0";
//開啟第一個線程,對js方法進行計算
ThreadStart ts = new ThreadStart(js);
Thread td = new Thread(ts);
td.Start();
//開啟第二個線程,對js方法進行計算
ThreadStart ts1 = new ThreadStart(js);
Thread td1 = new Thread(ts1);
td1.Start();
}
//多線程要重入的方法。
void js()
{
int a = Convert.ToInt32(textBox1.Text);
for (int i = 0; i < 2000; i++)
{
a++;
textBox1.Text = a.ToString();
}
}
}
出錯原因:兩個進程同時計算這個方法,不相干擾應該每個線程計算的結果都是2000的,但是這里的結果輸出卻讓人以外,原因是第一個兩個線程同時計算,并不是同時開始計算,而是根據cpu決定的哪個先開始,哪個后開始,雖然相差時間不多,但后開始的就會取用先開始計算過的數據計算,這樣就會導致計算錯亂。
解決辦法:解決這個的一個簡單辦法解釋給方法加鎖,加鎖的意思就是第一個線程取用過這個資源完畢后,第二個線程再來取用此資源。形成排隊效果。
下面給方法加鎖。
問題:關閉了窗口,消息框還能彈出。
}
void js()
{
for (int i = 0; i < 2000000000; i++) //如果看不出效果這里的2后面多加0
{
i++;
}
MessageBox.Show("關閉了窗口我還是要出來的!");
}
解決辦法:在代碼中設置td2.IsBackground=true;
--------------------------------------------------------------------------------
線程執行帶參數的方法
--------------------------------------------------------------------------------
新聞熱點
疑難解答