Java 高併發程式設計與詳解筆記(一)-- 初識 Java 執行緒
阿新 • • 發佈:2020-09-10
原文連結:Java 高併發程式設計與詳解筆記(一)-- 初識 Java 執行緒
從今天開始擼汪文君的《Java 高併發程式設計詳解(多執行緒與架構設計)》,做的筆記可能跟書上的目錄有所不同,純屬按照自己的理解重新構造一下,今天主題 -- 初識 Java 執行緒。
快速認識執行緒
建立執行緒的方式
只有一種,構造 Thread 類。
實現執行緒的執行單元方式:
- 重寫 Thread 的 run 方法。
- 實現 Runnable 介面的 run 方法,並將 Runnable 例項作為構造 Thread 的引數。
執行單元實現方式對應的設計模式
- 模板設計模式
- 策略設計模式
備註: 想了解更多的設計模式相關知識,可以參考上篇文章《 圖解設計模式-筆記》。
相關實現程式碼
重寫 Thread 的 run 方法
public class ConcreteThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread() + " run"); } public static void main(String[] args) { final ConcreteThread task = new ConcreteThread(); task.start(); } }
實現 Runnable 介面
public class TicketWindowRunnable implements Runnable { /** * 索引位置 */ private int index = 1; /** * 定義最大值為50 */ private final static int MAX = 50; @Override public void run() { while (index <= MAX) { // 同步鎖 synchronized (this) { if (index <= MAX) { System.out.println(Thread.currentThread() + " 的號碼是:" + (index++)); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { final TicketWindowRunnable task = new TicketWindowRunnable(); Thread window1 = new Thread(task, " 一號視窗 "); window1.start(); } }
觀察執行緒工具
- Jconsole
- jstack
執行緒的生命週期
書本上的執行緒的生命週期圖(下圖),是不對的(應該是程序的生命週期圖)。
應該更正為:
執行緒的生命週期可分為以下六個狀態:
- NEW: 還沒開始執行的新建立的執行緒
- RUNNABLE: 執行中或準備執行(等待排程)
- BLOCKED:等待獲取 Monitor 鎖進入或重新進入同步塊或方法
- WAITING:無時間限制等待其他執行緒執行特定操作
- TIMED_WAITING: 等待其他執行緒在指定時間內執行特定操作
- TERMINATED: 執行完成
理解 Thread 的構造方法
Thread 建構函式
建構函式相關聯的引數
- String name: 執行緒名稱
- ThreadGroup group:執行緒組
- Runnable target:執行單元
- long stackSize:棧大小
執行緒命名
- 構造 Thread 時指定名稱
- 在 Thread start() 呼叫之前通過 setName(String name) 指定名稱
執行緒的父子關係
Thread 在初始化(init)時會指定當前執行緒為新執行緒的父執行緒。
相關結論:
- 一個執行緒的建立肯定是由另一個執行緒完成的
- 被建立的執行緒的父執行緒是建立它的執行緒
Thread 與 ThreadGroup 關係
構造一個執行緒的時候,如果沒有顯式地指定 ThreadGroup,那麼它將會和父執行緒同屬於一個 ThreadGroup。
Thread 與 Runnable 關係
- Thread 負責執行緒本身相關的職責和控制
- Runnable 則負責邏輯執行單元的部分
Thread 與 JVM 虛擬棧關係
todo:學習JVM的時候,在好好的理解一下
守護執行緒
若JVM 中沒有非守護執行緒,不管有沒有守護執行緒,JVM 程序都會退出。當你希望關閉某些執行緒的時候,或者退出 JVM 程序的時候,一些執行緒能夠自動關閉,此時可以考慮用守護執行緒為你完成這樣的工作。