本文原始碼:GitHub·點這里 || GitEE·點這里
一、多執行緒導圖

二、多執行緒基礎
1、基礎概念
執行緒是作業系統能夠進行運算調度的最小單位,包含在行程之中,是行程中的實際運作單位,一條執行緒指的是行程中一個單一順序的控制流,一個行程中可以并發多個執行緒,每條執行緒并行執行不同的任務,
2、創建方式
繼承Thread類、實作Runnable介面、基于Callable和Future介面、Timer是后臺執行緒、執行緒池,
3、執行緒狀態

狀態描述:初始狀態、運行狀態、阻塞狀態、等待狀態、超時等待狀態、終止狀態,
4、執行機制

JVM中一個應用是可以有多個執行緒并行執行,執行緒被一對一映射為服務所在作業系統執行緒,調度在可用的CPU上執行,啟動時會創建一個作業系統執行緒;當該執行緒終止時,這個作業系統執行緒也會被回收,
5、記憶體模型

在虛擬機啟動運行時,會創建多個執行緒,資料區中有的模塊是執行緒共享的,有的是執行緒私有的:
執行緒共享:元資料區、堆Heap;
執行緒私有:虛擬機堆疊、本地方法堆疊、程式計數器;
單個CPU在特定時刻只能執行一個執行緒,所以多執行緒通過幾塊空間的使用,然后不斷的爭搶CPU的執行時間段,
三、常見概念
1、執行緒優先級
執行緒調度器傾向執行執行緒優先級高的執行緒,執行緒優先級高說明獲取CPU資源的概率高,或者獲取的執行時間分片多,被執行的概率高但不代表優先級低的一定最后執行,
2、守護執行緒
守護執行緒是支持輔助型執行緒,主要在程式中起到調度和支持性作用,當Jvm中非守護執行緒全部結束,守護執行緒也就會結束,
3、執行緒加入
執行緒A中,執行執行緒B的加入方法,那么A執行緒就會等待執行緒B執行完畢再回傳繼續執行,
4、本地執行緒
ThreadLocal也叫做執行緒本地變數,為變數在每個執行緒中的創建副本,每個執行緒可以訪問自己內部的副本變數,執行緒之間互不相互影響,
四、執行緒安全
在上圖執行緒與記憶體空間的占用方式看,在執行緒訪問共享記憶體塊時,保證執行緒安全就很有必要,
1、同步控制
Synchronized關鍵字同步控制,可以修飾方法,修飾代碼塊,修飾靜態方法等,同步控制的資源少,可以提高多執行緒效率,
2、加鎖機制
Lock介面:Java并發編程中資源加鎖的根介面之一,規定了資源鎖使用的幾個基礎方法,
ReentrantLock類:實作Lock介面的可重入鎖,即執行緒如果獲得當前實體的鎖,并進入任務方法,在執行緒沒有釋放鎖的狀態下,可以再次進入任務方法,特點:互斥排它性,即同一個時刻只有一個執行緒進入任務,
Condition介面:描述可能會與鎖有關聯的條件變數,提供了更強大的功能,例如在執行緒的等待/通知機制上,Conditon可以實作多路通知和選擇性通知,
3、Volatile關鍵字
volatile修飾成員變數,不能修飾方法,即標識該執行緒在訪問這個變數時需要從共享記憶體中獲取,對該變數的修改,也需要同步重繪到共享記憶體中,保證了變數對所有執行緒的可見性,
五、執行緒通信
執行緒是個獨立的個體,但是在執行緒執行程序中,如果處理同一個業務邏輯,可能會產生資源爭搶,導致并發問題,甚至死鎖現象,執行緒之間協調作業,就需要通信機制來保障,
1、基礎方法
相關方法是Java中Object層級的基礎方法,任何物件都有該方法:notify()隨機通知一個在該物件上等待的執行緒,使其結束wait狀態回傳;wait()執行緒進入waiting等待狀態,不會爭搶鎖物件,也可以設定等待時間;
2、等待/通知機制
等待/通知機制,該模式下指執行緒A在不滿足任務執行的情況下呼叫物件wait()方法進入等待狀態,執行緒B修改了執行緒A的執行條件,并呼叫物件notify()或者notifyAll()方法,執行緒A收到通知后從wait狀態回傳,進而執行后續操作,兩個執行緒通過基于物件提供的wait()/notify()/notifyAll()等方法完成等待和通知間互動,提高程式的可伸縮性,
3、管道流通信
管道流主要用于在不同執行緒間直接傳送資料,一個執行緒發送資料到輸出管道,另一個執行緒從輸入管道中讀取資料,進而實作不同執行緒間的通信,
六、執行緒池
1、Executor介面
Executor系統中,將執行緒任務提交和任務執行進行了解耦的設計,Executor有各種功能強大的實作類,提供便捷方式來提交任務并且獲取任務執行結果,封裝了任務執行的程序,不再需要Thread().start()方式,顯式創建執行緒并關聯執行任務,
2、核心引數

3、相關API類

執行緒池任務:核心介面:Runnable、Callable介面和介面實作類;
任務的結果:介面Future和實作類FutureTask;
任務的執行:核心介面Executor和ExecutorService介面,在Executor框架中有兩個核心類實作了ExecutorService介面,ThreadPoolExecutor和ScheduledThreadPoolExecutor,
七、常用執行緒API
1、Fork/Join機制
Fork/Join框架用于并行執行任務,核心的思想就是將一個大任務切分成多個小任務,然后匯總每個小任務的執行結果得到這個大任務的最終結果,核心流程:切分任務,模塊任務異步執行,單任務結果合并,
2、容器類
ConcurrentHashMap:使用分段鎖機制,把容器中資料分成一段一段的方式存盤,然后給每一段資料配一把鎖,當一個執行緒占用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問,即考慮安全性也顧及執行效率,
ConcurrentLinkedQueue:基于鏈接節點的無界執行緒安全佇列,按照FIFO先進先出原則對元素進行排序,佇列的頭部 是佇列中時間最長的元素,佇列的尾部是佇列中時間最短的元素,新的元素添加到佇列的尾部,獲取元素操作從佇列頭部得到,
3、原子類
JDK自帶原子操作類,處理多個執行緒同時操作一個變數的情況,其中包括:基本型別、陣列型別、參考型別、屬性修改型別,
八、應用場景
1、定時任務
通過配置設定一些程式在指定時間點,或者周期時間內規律回圈執行,這里任務的執行就是基于多執行緒技術,
2、異步處理
異步處理就是不按照當前同步代碼塊程式執行,異步處理與同步處理是對立的,異步的實作也需要多執行緒或者多行程,提高程式效率,
3、任務分解
分布式資料庫中常見操作,資料分布在不同的資料庫的副本中,在執行查詢時,每個服務都要跑查詢任務,最后在一個服務上做資料合并,或者提供一個中間引擎層,用來匯總資料,在大型的定時任務中,經常把要處理的任務按照特定策略分片,多個執行緒同時處理,
4、連接池技術
創建和管理一個連接的緩沖池的技術,這些連接準備好被任何需要它們的執行緒使用,減少連接不斷創建和釋放的問題,提高程式效率,
九、源代碼地址
GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile
推薦閱讀:編程體系整理
| 序號 | 專案名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
|---|---|---|---|---|
| 01 | Java描述設計模式,演算法,資料結構 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 02 | Java基礎、并發、面向物件、Web開發 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 03 | SpringCloud微服務基礎組件案例詳解 | GitHub·點這里 | GitEE·點這里 | ☆☆☆ |
| 04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合開發常用中間件 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 07 | 資料管理、分布式、架構設計基礎案例 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
| 08 | 大資料系列、存盤、組件、計算等框架 | GitHub·點這里 | GitEE·點這里 | ☆☆☆☆☆ |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151419.html
標籤:Java
上一篇:學習第44天
