前言:
面試官:多線程和單線程哪個快?
我憑借微弱的記憶以及正經分析回答:多線程快,因為可以執行多個任務,而單線程只能執行一個任務。
面試官:無論什么情況多線程都比單線程快嗎?
我猶豫了一下正經回答:不是的,線程執行消耗的是cpu的,cpu資源是有限的,所有不是一直比單線程快。
面試官:那什么情況下單線程比多線程快?
我…:這…不清楚。
面試官:你沒有學過《計算機基礎》嗎?你已經自相矛盾了…
我:沒學過,好吧,我不知道。
后來這個面試官變成了我的老大,技術總監,進公司第一天下午討論某問題之后單獨叫我談話。
老大問我那個問題有沒有去了解過。
我虛了:我看了,不一定,多線程存在上下文切換。
老大:多線程一定比單線程慢,上下文切換你知道什么意思嗎?
我心想完了:額…看了忘記了。
然后噼里啪啦跟我解釋,我現在依舊忘記了…
正文:
回家后我再次查閱資料:
首先分配cpu資源的單位是進程。一個進程所獲得到的cpu資源是一定的。程序在執行的過程中消耗的是cpu,比如一個單核cpu,多個線程同時執行工作時,需要不斷切換執行(上下文切換),單個線程時間耗費更多了,而單線程只是一個線程跑。
比如:
處理10個報表,
在單線程的情況下,假如說我們生成10個報表文件需要1個小時。
單線程是先執行完第一個報表,用了6分鍾,再執行第二個報表,也用6分鍾。總計1個小時
多線程,是10個報表一起執行,但是每一個報表都要1個小時。
總結:多線程的總體執行時間和單線程是一樣的,但是多線程中單個線程的執行時間是單線程的多倍。
多線程提高的是並發數量,比如現在有一個4核cpu的服務器,同一時間可執行4個線程,這樣處理線程任務的速度比較快。但是多出來的線程,5個,6個,7個,多出的線程還是要等待。
上下文切換
多線程編程中一般線程的個數都大於 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,為了讓這些線程都能得到有效執行,CPU 采取的策略是為每個線程分配時間片並輪轉的形式。當一個線程的時間片用完的時候就會重新處於就緒狀態讓給其他線程使用,這個過程就屬於一次上下文切換。
概括來說就是:當前任務在執行完 CPU 時間片切換到另一個任務之前會先保存自己的狀態,以便下次再切換會這個任務時,可以再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換。
后記:
基礎不牢固的情況下去回答問題是非常容易打臉的,回答出的答案也是稀里糊塗的,稍微換個角度攻擊就會一臉懵逼,學習更多的新技術其實沒太大用處,因為這個行業技術迭代的很快,基礎才是永久的飯碗,所以我決定從java虛擬機開始入手,修煉內功,找對方向獲得會更多!