【多線程與高併發】從一則招聘信息進入多線程的世界

多線程的學習方法

多線程做爲面試的重災區,若是咱們可以進行深刻的瞭解和使用,對咱們而言是很是有有益的,尤爲是在面試的時候,若是多線程回答的好,是很是可以加分的。這樣纔可以經受住面試官的奪命連環問!java

無論學什麼,咱們都須要有一個總體的認知,俯瞰其全貌,瞭解其細節,若是能夠的話,最好是畫一個思惟導圖,將其中的分支和一個個的小的知識點,記錄上去,方便咱們學習的時候,逐步有條理的分解性學習,從而達到從點到面,從面到體的過程。面試

多於多線程的學習,比較推薦的天然仍是本身動手作小實驗和了解理論基礎,咱們在時間充裕的狀況下,能夠看有關於多線程的書籍,好比(Java多線程編程核心技術、Java併發編程實戰 (java併發的聖經)、多處理器編程的藝術)等等,可是對於時間不太充裕的同窗,看書和本身動手實踐的時間就會比較少,這個時候咱們只能靠背、看面試題的方法去學習。算法

壓榨CPU性能

在以前的時候,小農有看到一個面試要求,小農看到了以爲頗有意思,就記錄下來了,是什麼呢?數據庫

  1. Java基礎紮實,熟悉JVM、多線程、集合等基礎,熟悉分佈式、緩存、消息、搜索等機制
  2. 三年以上Java開發經驗,熟悉Spring、MyBatis等框架
  3. 對於壓榨CPU性能有濃厚興趣!
  4. 具備必定項目規劃和決策能力,善於捕捉業務需求、系統架構設計中存在的問題,並給出有效的解決方案
  5. 具備高度領域設計能力和業務分析能力,能獨立分析和解決問題

咱們看到第三條,對CPU性能壓榨有濃厚的興趣,線程的歷史,就是對電腦CPU壓榨的一個歷史,當咱們的多線程越多效率越高,對於CPU的壓榨也就越厲害,可是壓榨的時候咱們也須要注意,在壓榨的同時,保證程序的正常運行也是咱們須要考慮的一個點。編程

線程的歷史

對於線程的歷史,其實就是對於服務器的CPU進行不斷的利用的升級過程。當咱們學習一個新技術的時候,去了解這個技術的背景,能夠更好的瞭解和掌握新技術,雖然這個過程看起來無用且浪費時間,可是在咱們後面的學習過程,可以幫助咱們更好的理解新技術。從線程的發展來看,能夠分爲五個階段:緩存

一、單進程

最先的就是單進程進行人工切換,那個時候的程序,一次就只能運行一個程序,當咱們想要切換別的程序的時候,只能人工中止當前程序,再來運行別的程序,這個時候CPU利用率不高,不少時候是等着人工來進行干預,以下圖所示:服務器

在這裏插入圖片描述

二、批處理

慢慢的有人就以爲這種方式太慢了,或者太影響效率了,因而就有了多進程批處理,能夠理解爲,在咱們進程裏面,有ABCDF五個程序,咱們能夠一次性輸出這五個程序,不用再他們之間在進行切換,可是若是程序A阻塞了,那麼其餘四個程序就須要進行等待,以下圖所示:markdown

在這裏插入圖片描述

三、並行處理

把程序寫在不一樣的內存位置上來回切換,好比咱們有ABC三個程序,程序A去CPU進行運算,可是因爲網絡的延遲或者什麼緣由,致使程序A阻塞了,那麼這個時候程序B就能夠去CPU裏面去執行,若是程序B也阻塞了,那麼程序C就能夠去CPU裏面執行網絡

在這裏插入圖片描述

四、多線程

程序內部能夠有不一樣的任務進行來回的線程切換,好比說咱們使用的IDEA,它內部可能有的在等待網絡的傳輸,有的在進行代碼的展現,有的在進行save,將咱們的代碼保存在歷史記錄等等,這些個任務他們執行的時候也是並行的執行的,這個時候就產生了線程的概念,線程是屬於一個進程裏面並行執行的這樣的不一樣的路線,一個程序不一樣任務的切換,一個線程若是要提高他的效率的,內部實際上是很是複雜的。其中設計到網絡和IO的知識。多線程

五、纖程/協程

是一種最輕量化的線程,一種綠色的線程,它也是一種用戶線程,就是有用戶本身管理,再也不由計算機去管理, 讓應用程序能夠獨立決定本身的線程要如何運做。操做系統內核不能看見它,也不會爲它進行調度,纖程有本身的尋址空間。應用程序能夠在一個線程環境中建立多個纖程,而後手動運行它。纖程不會被自動運行,必需要由應用程序自已指定讓它運行,或換到下一個纖程。

進程/線程/纖程

一、什麼是進程

進程就是說在系統中正在運行的應用程序,程序一旦運行就是進程,好比咱們經常使用的QQ,WeChat等等,進程是系統進行資源分配的獨立實體,每一個進程都有本身獨立的地址空間,一個進程能夠有多個線程,每一個線程使用本身所屬進程的棧空間。

// 進程:是操做系統資源分配的基本單位,好比內存、打開文件、網絡IO,分配了獨立的內存空間
public class T00_Process {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}
複製代碼

在這裏插入圖片描述

在這裏插入圖片描述

二、什麼是線程

線程是程序執行的最小單位,它被包含在進程之中,是進程中的實際運做單位。一條線程指的是一個單一順序的控制流,一個進程中能夠併發多個線程,每條線程並行執行不一樣的任務,一般也被稱爲輕量進程。

單線程:

單線程下,不一樣的執行路徑 在這裏插入圖片描述

多線程: 在這裏插入圖片描述

三、什麼是纖程

纖程(Fiber)包含獨立的目態棧,寄存器狀態的控制信息,目態控制的纖程轉接要求較高的編程經驗,因爲纖程屬於目態對象,一個纖程被封鎖意味着所在線程被封鎖,應用程序能夠經過ConvertThreadToFiber將線程轉換爲纖程,與線程對比,纖程具備切換速度快的特色。

纖程具備的特徵

  • 線程是在Windows內核中實現的,操做系統會根據系統的調度算法對線程進行調度。
  • 纖程是在用戶模式下實現的,內核對纖程一無所知。
  • 纖程是更輕量級的線程,一個線程能夠包含一個或多個纖程

什麼是線程的切換

什麼是線程的上下文切換?: 多線程的上下文切換是指 CPU 控制權由一個已經正在運行的線程切換到另一個就緒並等待獲取 CPU 執行權的線程的過程。

單核CPU設定多線程是否有意義

一般一個任務不光 cpu 上要花時間, io 上也要花時間(例如去數據庫查數據,去抓網頁,讀寫文件等)。 一個進程在等 io 的時候, cpu 是閒置的,另外一個進程正好能夠利用 cpu 進行計算。 多幾個進程一塊兒跑,能夠把 io 和 cpu 都跑滿了。 如今通常都是虛擬資源,資源有彈縮機制,因此通常該跑多線程的時候就能夠跑多線程。

工做線程數是否是設置的越大越好

固然不是,線程的切換也是須要消耗資源的,越多意味着線程來回之間的切換。

我是牧小農,怕什麼真理無窮進一步有進一步的歡喜,你們加油

相關文章
相關標籤/搜索