1. 程式人生 > 實用技巧 >Java 高併發程式設計與詳解筆記(一)-- 初識 Java 執行緒

Java 高併發程式設計與詳解筆記(一)-- 初識 Java 執行緒

原文連結: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 程序的時候,一些執行緒能夠自動關閉,此時可以考慮用守護執行緒為你完成這樣的工作。