執行緒簡介
1.1 什么是執行緒
在理解什么是執行緒之前還要知道一個概念——行程,現代作業系統在運行一個java程式時,會為其創建一個行程,而現代作業系統調度的最小單元是執行緒,也叫輕量級行程(light weight process),在一個行程里面可以創建多個執行緒,這些執行緒都擁有各自的計數器、堆疊和區域變數等屬性,并且能夠訪問共享的記憶體變數,處理器在這些執行緒上高速切換,讓使用者感覺得這些執行緒在同時運行,
一個Java程式從main()方法開始執行,看似只有一個執行緒,但實際上Java天生就是多執行緒,因為執行main()方法的是一個名稱為main的執行緒,我們來看看一個普通的java執行緒包含哪些執行緒,
public class MultiThread {
public static void main(String[] args) {
// 獲取Java執行緒管理 MXBean
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// 獲取執行緒和執行緒數堆疊資訊,后兩個引數為true則為獲取同步的monitors和synchronize資訊
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// 遍歷執行緒資訊,僅列印執行緒ID和執行緒名稱
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("id:" + threadInfo.getThreadId() + "name:" + threadInfo.getThreadName());
}
}
}
運行結果:
id:6 name:Monitor Ctrl-Break
id:5 name:Attach Listener
id:4 name:Signal Dispatcher
id:3 name:Finalizer
id:2 name:Reference Handler
id:1 name:main
可以看到一個Java程式的運行是由main執行緒和多個執行緒一起組成的,
1.2 為什么用多執行緒
簡單歸結為以下幾點:
- 更多的處理核心
隨著處理器核心越來越多,而一個單執行緒程式在運行時只能使用一個核心處理,多核反而無法提升程式的執行效率,使用多執行緒技術,將計算邏輯分配到多核處理器核心,就會顯著減少陳旭處理時間,提升程式執行效率, - 更快的回應時間
在一些復雜的業務邏輯中,將資料一致性不強的操作派發給其他執行緒處理(也可使用訊息佇列),如生成訂單快照,發送郵件等,縮短回應時間,提升用戶體驗, - 更好的編程模式
Java為多執行緒程式提供了良好、考究并且一致的編程模型,使開發人員專注于問題的解決,
1.3 執行緒優先級
優先級高低決定了執行緒分配時間片的數量,現代作業系統基本采用時分的形式調度運行的執行緒,作業系統會分出一個個的時間片,執行緒會分配到若干時間片,當執行緒的時間片用完了就會發生執行緒調度,并等待下次分配,
在java中,通過Thread.setPriority(int)方法來修改優先級,默認優先級是5,(執行緒優先級不能作為執行緒正確性的依賴)
1.4 執行緒的狀態
| 狀態名稱 | 說明 |
|---|---|
| NEW | 初始狀態,執行緒被構建,但是還沒有呼叫start()方法 |
| RUNNABLE | 運行狀態,Java執行緒將作業系統中的就緒和運行兩種狀態籠統的稱作“運行中” |
| BLOCKED | 阻塞狀態,表示執行緒阻塞于鎖 |
| WAITING | 等待狀態,表示執行緒進入等待狀態,進入該狀態表示當前執行緒需要等待其他執行緒做出一些特定動作(喚醒或中斷) |
| TIMED_WAITING | 超時等待狀態,可以在指定時間自行喚醒 |
| TERMINATED | 終止狀態,表示當前執行緒已經執行完畢 |
執行緒在自身的生命周期中,并不是固定處在某個狀態,而是隨著代碼的執行在不同的狀態之間切換,

由圖中可以看到,執行緒創建(初始化)之后,呼叫start()方法開始運行,當執行緒執行wait()方法之后,執行緒進入等待狀態,進圖等待狀態的執行緒需要依靠其他執行緒的通知才能回傳的運行狀態,而超時等待狀態只需要超時時間到達時就可以回傳到運行狀態,當執行緒代用同步方法死,在沒有獲取到鎖的情況下,執行緒將會進入到阻塞狀態,執行緒在執行Runnable的run()方法之后將會進入終止狀態,
注: Java將作業系統中的運行和就緒兩個狀態合并成為運行狀態,阻塞狀態是執行緒阻塞在Synchronize關鍵字修飾的方法或代碼塊(獲取鎖)時的狀態,但是阻塞在java.concurrent包中Lock介面執行緒的狀態為等待狀態,因為java.concurrent包中Lock介面對于阻塞的實作使用了LockSupport類中相關的方法,
結尾
本篇文章具體講解了何為執行緒、使用多執行緒的好處,重點是執行緒的狀態以及執行緒狀態的變遷,希望對各位開發同學有用,歡迎大家留言探討一起學習進步,共勉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276613.html
標籤:java
