進程是系統中正在運行的一個程序,程序一旦運行就是進程。數據結構
進程能夠當作程序執行的一個實例。進程是系統資源分配的獨立實體,每一個進程都擁有獨立的地址空間。一個進程沒法訪問另外一個進程的變量和數據結構,若是想讓一個進程訪問另外一個進程的資源,須要使用進程間通訊,好比管道,文件,套接字等。多線程
一個進程能夠擁有多個線程,每一個線程使用其所屬進程的棧空間。線程與進程的一個主要區別是,統一進程內的一個主要區別是,同一進程內的多個線程會共享部分狀態,多個線程能夠讀寫同一塊內存(一個進程沒法直接訪問另外一進程的內存)。併發
示例:任務管理器中可看,一個個應用都表明一個 進程異步
線程是操做系統進行運算調度的最小單位。this
進程在執行任何一個 操做或者響應,都是由線程去完成的,進程包含線程,線程必定屬於進程,進程和線程之間是一對多的關係操作系統
一個進程裏面有多個執行流併發執行。好比一我的既能夠某一段時間內即看電視有吃東西,每一個動做相似於線程,在同一段時間內作不一樣的事,而且還能夠進行信息共享。線程
如下實現都基於C#進行實現。3d
UI界面展現:blog
計算耗時方法代碼:進程
public void DoSomething(int n) { var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"button1_Click{n} ==》線程ID:{threadId} ==》當前時間:{DateTime.Now.ToLongTimeString()} start......"); var num = 0; for (int i = 0; i < 1_000_000_000; i++) { num += i; } Console.WriteLine($"button1_Click{n} ==》線程ID:{threadId} ==》當前時間:{DateTime.Now.ToLongTimeString()} end......"); }
同步方法代碼:
//同步方法 private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 5; i++) { this.DoSomething(i);//執行耗時方法 } }
異步多線程方法代碼:
//異步多線程方法 private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < 5; i++) {
int k = i; var task=Task.Run(() => { this.DoSomething(k); });//執行耗時方法
} }
同步方法跟異步多線程方法執行後效果對比:
控制檯數據結果:
CPU佔用資源結果:
結果分析:
從執行結果來看,總結幾點
1.同步比異步執行時間更長,同步只有一個線程參與計算(主線程),因爲主線程參與計算,致使UI界面卡頓,計算完成後主線程閒置,UI界面不卡頓,
異步執行時間短,界面不卡頓,主線程閒置,啓用五個線程參與計算,效率高,但佔用CPU資源較多。
2.同步符合正常程序邏輯,有序執行,異步執行順序是無序的,執行順序是有CPU調度決定。
3.從執行時間來看,單線程執行時間爲16582ms,啓用五個線程執行時間爲3460ms,以正常思惟來看,一個線程執行16582ms,五個線程執行應該是3316ms纔對,並無起到五倍的效率。
緣由有兩點:1.資源是有限的 2.線程調度會有損耗
同步單線程方式執行效率低,界面卡頓,用戶體驗性不太好,佔用CPU資源少。
異步多線程方式執行效率高,界面不卡頓,用戶體驗性較好,佔用CUP資源多。
有時候使用多線程並非越多越好,應酌情使用。