線程是作業系統能夠進行運算排程的最小機關,包含在程序之中,是程序中的實際運作機關。一條線程指的是程序中一個單一順序的控制流,一個程序中可以并發多個線程,每條線程并行執行不同的任務。
本文源碼: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。
1、Fork/Join機制
Fork/Join架構用于并行執行任務,核心的思想就是将一個大任務切分成多個小任務,然後彙總每個小任務的執行結果得到這個大任務的最終結果。核心流程:切分任務,子產品任務異步執行,單任務結果合并。
2、容器類
ConcurrentHashMap:使用分段鎖機制,把容器中資料分成一段一段的方式存儲,然後給每一段資料配一把鎖,當一個線程占用鎖通路其中一個段資料的時候,其他段的資料也能被其他線程通路,即考慮安全性也顧及執行效率。
ConcurrentLinkedQueue:基于連結節點的無界線程安全隊列,按照FIFO先進先出原則對元素進行排序,隊列的頭部 是隊列中時間最長的元素,隊列的尾部是隊列中時間最短的元素,新的元素添加到隊列的尾部,擷取元素操作從隊列頭部得到。
3、原子類
JDK自帶原子操作類,處理多個線程同時操作一個變量的情況,其中包括:基本類型、數組類型、引用類型、屬性修改類型。
1、定時任務
通過配置設定一些程式在指定時間點,或者周期時間内規律循環執行,這裡任務的執行就是基于多線程技術。
2、異步處理
異步處理就是不按照目前同步代碼塊程式執行,異步處理與同步處理是對立的,異步的實作也需要多線程或者多程序,提高程式效率。
3、任務分解
分布式資料庫中常見操作,資料分布在不同的資料庫的副本中,在執行查詢時,每個服務都要跑查詢任務,最後在一個服務上做資料合并,或者提供一個中間引擎層,用來彙總資料,在大型的定時任務中,經常把要處理的任務按照特定政策分片,多個線程同時處理。
4、連接配接池技術
建立和管理一個連接配接的緩沖池的技術,這些連接配接準備好被任何需要它們的線程使用,減少連接配接不斷建立和釋放的問題,提高程式效率。
推薦閱讀:程式設計體系整理
序号
項目名稱
GitHub位址
GitEE位址
推薦指數
01
Java描述設計模式,算法,資料結構
GitHub·點這裡
GitEE·點這裡
☆☆☆☆☆
02
Java基礎、并發、面向對象、Web開發
☆☆☆☆
03
SpringCloud微服務基礎元件案例詳解
☆☆☆
04
SpringCloud微服務架構實戰綜合案例
05
SpringBoot架構基礎應用入門到進階
06
SpringBoot架構整合開發常用中間件
07
資料管理、分布式、架構設計基礎案例
08
大資料系列、存儲、元件、計算等架構