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


多線程的學習方法

多線程作為面試的重災區,如果我們能夠進行深入的了解和使用,對我們而言是非常有有益的,尤其是在面試的時候,如果多線程回答的好,是非常能夠加分的。這樣才能夠經受住面試官的奪命連環問!

不管學什么,我們都需要有一個整體的認知,俯瞰其全貌,了解其細節,如果可以的話,最好是畫一個思維導圖,將其中的分支和一個個的小的知識點,記錄上去,方便我們學習的時候,逐步有條理的分解性學習,從而達到從點到面,從面到體的過程。

多於多線程的學習,比較推薦的自然還是自己動手做小實驗和了解理論基礎,我們在時間充裕的情況下,可以看有關於多線程的書籍,比如(Java多線程編程核心技術、Java並發編程實戰 (java並發的聖經)、多處理器編程的藝術)等等,但是對於時間不太充裕的同學,看書和自己動手實踐的時間就會比較少,這個時候我們只能靠背、看面試題的方法去學習。

壓榨CPU性能

在之前的時候,小農有看到一個面試要求,小農看到了覺得很有意思,就記錄下來了,是什么呢?

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

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

線程的歷史

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

1、單進程

最早的就是單進程進行人工切換,那個時候的程序,一次就只能運行一個程序,當我們想要切換別的程序的時候,只能人工停止當前程序,再來運行別的程序,這個時候CPU利用率不高,很多時候是等着人工來進行干預,如下圖所示:

在這里插入圖片描述

2、批處理

慢慢的有人就覺得這種方式太慢了,或者太影響效率了,於是就有了多進程批處理,可以理解為,在我們進程里面,有ABCDF五個程序,我們可以一次性輸出這五個程序,不用再他們之間在進行切換,但是如果程序A阻塞了,那么其他四個程序就需要進行等待,如下圖所示:

在這里插入圖片描述

3、並行處理

把程序寫在不同的內存位置上來回切換,比如我們有ABC三個程序,程序A去CPU進行運算,但是由於網絡的延遲或者什么原因,導致程序A阻塞了,那么這個時候程序B就可以去CPU里面去執行,如果程序B也阻塞了,那么程序C就可以去CPU里面執行

在這里插入圖片描述

4、多線程

程序內部可以有不同的任務進行來回的線程切換,比如說我們使用的IDEA,它內部可能有的在等待網絡的傳輸,有的在進行代碼的展示,有的在進行save,將我們的代碼保存在歷史記錄等等,這些個任務他們執行的時候也是並行的執行的,這個時候就產生了線程的概念,線程是屬於一個進程里面並行執行的這樣的不同的路線,一個程序不同任務的切換,一個線程如果要提升他的效率的,內部其實是非常復雜的。其中設計到網絡和IO的知識。

5、纖程/協程

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

進程/線程/纖程

1、什么是進程

進程就是說在系統中正在運行的應用程序,程序一旦運行就是進程,比如我們常用的QQ,WeChat等等,進程是系統進行資源分配的獨立實體,每個進程都有自己獨立的地址空間,一個進程可以有多個線程,每個線程使用自己所屬進程的棧空間。

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

在這里插入圖片描述

在這里插入圖片描述

2、什么是線程

線程是程序執行的最小單位,它被包含在進程之中,是進程中的實際運作單位。一條線程指的是一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務,通常也被稱為輕量進程。

單線程:

單線程下,不同的執行路徑
在這里插入圖片描述

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

3、什么是纖程

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

纖程具有的特征

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

什么是線程的切換

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

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

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

工作線程數是不是設置的越大越好

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

我是牧小農,怕什么真理無窮進一步有進一步的歡喜,大家加油


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM