進程、線程、多線程

1.什麼是進程?

   進程是系統中正在運行的一個程序,程序一旦運行就是進程。數據結構

進程能夠當作程序執行的一個實例。進程是系統資源分配的獨立實體,每一個進程都擁有獨立的地址空間。一個進程沒法訪問另外一個進程的變量和數據結構,若是想讓一個進程訪問另外一個進程的資源,須要使用進程間通訊,好比管道,文件,套接字等。多線程

           一個進程能夠擁有多個線程,每一個線程使用其所屬進程的棧空間。線程與進程的一個主要區別是,統一進程內的一個主要區別是,同一進程內的多個線程會共享部分狀態,多個線程能夠讀寫同一塊內存(一個進程沒法直接訪問另外一進程的內存)。併發

示例:任務管理器中可看,一個個應用都表明一個 進程異步

 

 

 

 

 

 

 

 

 

 

 2.什麼是線程?

線程是操做系統進行運算調度的最小單位。this

進程在執行任何一個 操做或者響應,都是由線程去完成的,進程包含線程,線程必定屬於進程,進程和線程之間是一對多的關係操作系統

3.什麼是多線程?

一個進程裏面有多個執行流併發執行。好比一我的既能夠某一段時間內即看電視有吃東西,每一個動做相似於線程,在同一段時間內作不一樣的事,而且還能夠進行信息共享。線程

4.任何實現單線程、多線程?單線程跟多線程之間有什麼區別?

如下實現都基於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.線程調度會有損耗

 

 

5.總結

同步單線程方式執行效率低,界面卡頓,用戶體驗性不太好,佔用CPU資源少。

異步多線程方式執行效率高,界面不卡頓,用戶體驗性較好,佔用CUP資源多。

有時候使用多線程並非越多越好,應酌情使用。