本文源碼:GitHub·點這裏 || GitEE·點這裏java
一、基礎概念git
線程是操做系統可以進行運算調度的最小單位,包含在進程之中,是進程中的實際運做單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,每條線程並行執行不一樣的任務。github
二、建立方式算法
繼承Thread類、實現Runnable接口、基於Callable和Future接口、Timer是後臺線程、線程池。spring
三、線程狀態數據庫
狀態描述:初始狀態、運行狀態、阻塞狀態、等待狀態、超時等待狀態、終止狀態。編程
四、執行機制設計模式
JVM中一個應用是能夠有多個線程並行執行,線程被一對一映射爲服務所在操做系統線程,調度在可用的CPU上執行,啓動時會建立一個操做系統線程;當該線程終止時,這個操做系統線程也會被回收。api
五、內存模型數組
在虛擬機啓動運行時,會建立多個線程,數據區中有的模塊是線程共享的,有的是線程私有的:
線程共享:元數據區、堆Heap;
線程私有:虛擬機棧、本地方法棧、程序計數器;
單個CPU在特定時刻只能執行一個線程,因此多線程經過幾塊空間的使用,而後不斷的爭搶CPU的執行時間段。
一、線程優先級
線程調度器傾向執行線程優先級高的線程,線程優先級高說明獲取CPU資源的機率高,或者獲取的執行時間分片多,被執行的機率高但不表明優先級低的必定最後執行。
二、守護線程
守護線程是支持輔助型線程,主要在程序中起到調度和支持性做用,當Jvm中非守護線程所有結束,守護線程也就會結束。
三、線程加入
線程A中,執行線程B的加入方法,那麼A線程就會等待線程B執行完畢再返回繼續執行。
四、本地線程
ThreadLocal也叫作線程本地變量,爲變量在每一個線程中的建立副本,每一個線程能夠訪問本身內部的副本變量,線程之間互不相互影響。
在上圖線程與內存空間的佔用方式看,在線程訪問共享內存塊時,保證線程安全就頗有必要。
一、同步控制
Synchronized關鍵字同步控制,能夠修飾方法,修飾代碼塊,修飾靜態方法等,同步控制的資源少,能夠提升多線程效率。
二、加鎖機制
Lock接口:Java併發編程中資源加鎖的根接口之一,規定了資源鎖使用的幾個基礎方法。
ReentrantLock類:實現Lock接口的可重入鎖,即線程若是得到當前實例的鎖,並進入任務方法,在線程沒有釋放鎖的狀態下,能夠再次進入任務方法,特色:互斥排它性,即同一個時刻只有一個線程進入任務。
Condition接口:描述可能會與鎖有關聯的條件變量,提供了更強大的功能,例如在線程的等待/通知機制上,Conditon能夠實現多路通知和選擇性通知。
三、Volatile關鍵字
volatile修飾成員變量,不能修飾方法,即標識該線程在訪問這個變量時須要從共享內存中獲取,對該變量的修改,也須要同步刷新到共享內存中,保證了變量對全部線程的可見性。
線程是個獨立的個體,可是在線程執行過程當中,若是處理同一個業務邏輯,可能會產生資源爭搶,致使併發問題,甚至死鎖現象,線程之間協調工做,就須要通訊機制來保障。
一、基礎方法
相關方法是Java中Object層級的基礎方法,任何對象都有該方法:notify()隨機通知一個在該對象上等待的線程,使其結束wait狀態返回;wait()線程進入waiting等待狀態,不會爭搶鎖對象,也能夠設置等待時間;
二、等待/通知機制
等待/通知機制,該模式下指線程A在不知足任務執行的狀況下調用對象wait()方法進入等待狀態,線程B修改了線程A的執行條件,並調用對象notify()或者notifyAll()方法,線程A收到通知後從wait狀態返回,進而執行後續操做。兩個線程經過基於對象提供的wait()/notify()/notifyAll()等方法完成等待和通知間交互,提升程序的可伸縮性。
三、管道流通訊
管道流主要用於在不一樣線程間直接傳送數據,一個線程發送數據到輸出管道,另外一個線程從輸入管道中讀取數據,進而實現不一樣線程間的通訊。
一、Executor接口
Executor系統中,將線程任務提交和任務執行進行了解耦的設計,Executor有各類功能強大的實現類,提供便捷方式來提交任務而且獲取任務執行結果,封裝了任務執行的過程,再也不須要Thread().start()方式,顯式建立線程並關聯執行任務。
二、核心參數
三、相關API類
線程池任務:核心接口:Runnable、Callable接口和接口實現類;
任務的結果:接口Future和實現類FutureTask;
任務的執行:核心接口Executor和ExecutorService接口。在Executor框架中有兩個核心類實現了ExecutorService接口,ThreadPoolExecutor和ScheduledThreadPoolExecutor。
一、Fork/Join機制
Fork/Join框架用於並行執行任務,核心的思想就是將一個大任務切分紅多個小任務,而後彙總每一個小任務的執行結果獲得這個大任務的最終結果。核心流程:切分任務,模塊任務異步執行,單任務結果合併。
二、容器類
ConcurrentHashMap:使用分段鎖機制,把容器中數據分紅一段一段的方式存儲,而後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其餘段的數據也能被其餘線程訪問,即考慮安全性也顧及執行效率。
ConcurrentLinkedQueue:基於連接節點的無界線程安全隊列,按照FIFO先進先出原則對元素進行排序,隊列的頭部 是隊列中時間最長的元素,隊列的尾部是隊列中時間最短的元素,新的元素添加到隊列的尾部,獲取元素操做從隊列頭部獲得。
三、原子類
JDK自帶原子操做類,處理多個線程同時操做一個變量的狀況,其中包括:基本類型、數組類型、引用類型、屬性修改類型。
一、定時任務
經過配置設置一些程序在指定時間點,或者週期時間內規律循環執行,這裏任務的執行就是基於多線程技術。
二、異步處理
異步處理就是不按照當前同步代碼塊程序執行,異步處理與同步處理是對立的,異步的實現也須要多線程或者多進程,提升程序效率。
三、任務分解
分佈式數據庫中常見操做,數據分佈在不一樣的數據庫的副本中,在執行查詢時,每一個服務都要跑查詢任務,最後在一個服務上作數據合併,或者提供一箇中間引擎層,用來彙總數據,在大型的定時任務中,常常把要處理的任務按照特定策略分片,多個線程同時處理。
四、鏈接池技術
建立和管理一個鏈接的緩衝池的技術,這些鏈接準備好被任何須要它們的線程使用,減小鏈接不斷建立和釋放的問題,提升程序效率。
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·點這裏 | ☆☆☆☆☆ |