【連載 02】多執行緒實現

FunTester發表於2024-11-28

Java 多執行緒實現

Java 多執行緒有多種實現方式,在測試工作中最常用的有兩種:

  1. 繼承 java.lang.Thread
  2. 實現 java.lang.Runnable 介面

1. 繼承 Thread

透過繼承 java.lang.Thread 實現 Java 多執行緒的步驟如下:

  1. 定義一個繼承自 Thread 的子類,並重寫 run() 方法。
  2. run() 方法中編寫多執行緒執行的程式碼邏輯。
  3. 建立 Thread 子類的例項,呼叫 start() 方法啟動新執行緒。

示例程式碼

package org.funtester.performance.books.chapter01.section2;

/**
 * 繼承 {@link Thread} 實現 Java 多執行緒 
 */
public class FunThreadFirst extends Thread {

    /**
     * 主執行緒
     * @param args
     */
    public static void main(String[] args) {
        new FunThreadFirst().start(); // 啟動執行緒
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 列印執行緒名稱
    }

    /**
     * 重寫 {@link Thread#run()} 方法
     */
    @Override
    public void run() {
        try {
            Thread.sleep(100); // 睡眠 100 毫秒
        } catch (InterruptedException e) {
            e.printStackTrace(); // 列印異常堆疊
        }
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 列印執行緒名稱
    }
}

控制檯輸出

Hello FunTester!    main
Hello FunTester!    Thread-0

我們在 run() 方法中增加了 100ms 的休眠,這樣 main 執行緒的輸出會優先於我們建立的多執行緒 Thread-0 輸出,表明 main 執行緒與 Thread-0 是併發執行的,非阻塞。

2. 實現 Runnable 介面

透過實現 java.lang.Runnable 介面實現 Java 多執行緒的步驟如下:

  1. 定義一個類,並實現 Runnable 介面的 run() 方法。
  2. run() 方法中編寫多執行緒執行邏輯。
  3. 建立 Runnable 實現類物件,並傳遞給 Thread 構造方法建立執行緒物件,然後啟動執行緒。

示例程式碼

package org.funtester.performance.books.chapter01.section2;

/**
 * 實現 {@link Runnable} 介面實現 Java 多執行緒
 */
public class FunThreadSecond implements Runnable {

    /**
     * 主執行緒
     * @param args
     */
    public static void main(String[] args) {
        FunThreadSecond second = new FunThreadSecond(); // 建立 Runnable 例項
        new Thread(second).start(); // 啟動執行緒
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 列印執行緒名稱
    }

    /**
     * 重寫 {@link Runnable#run()} 方法
     */
    @Override
    public void run() {
        try {
            Thread.sleep(100); // 睡眠 100 毫秒
        } catch (InterruptedException e) {
            e.printStackTrace(); // 列印異常堆疊
        }
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 列印執行緒名稱
    }
}

控制檯輸出

Hello FunTester!    main
Hello FunTester!    Thread-0

同樣地,輸出順序表明兩個執行緒的執行程式碼相互不干擾,是非阻塞的。

3. 使用 Lambda 表示式實現多執行緒

在 Java 8 中,可以使用 Lambda 表示式實現多執行緒。這種方式是實現 Runnable 介面的簡化變種,語法更加簡潔,在後續執行緒池中使用時也非常常見。

示例程式碼

package org.funtester.performance.books.chapter01.section2;

/**
 * 使用 Lambda 表示式實現 Java 多執行緒
 */
public class FunThreadThird {

    /**
     * 主執行緒
     * @param args
     */
    public static void main(String[] args) {
        new Thread(() -> System.out.println("Hello FunTester!    " + Thread.currentThread().getName())).start(); // 建立並啟動執行緒
        System.out.println("Hello FunTester!    " + Thread.currentThread().getName()); // 列印執行緒名稱
    }
}

控制檯輸出

Hello FunTester!    main
Hello FunTester!    Thread-0

總結

  • 繼承 Thread:適合需要擴充套件 Thread 類功能的場景,但 Java 不支援多繼承,限制了類的設計。
  • 實現 Runnable 介面:更靈活,適合多個執行緒共享同一任務邏輯的場景。
  • 使用 Lambda 表示式:語法簡潔,推薦在支援 Java 8 的專案中使用。

每種方法都有其適用場景,根據實際需求選擇合適的實現方式。

書的名字:從 Java 開始做效能測試

如果本書內容對你有所幫助,希望各位多多讚賞,讓我可以貼補家用。讚賞兩位數可以提前閱讀未公開章節。我也會嘗試製作本書的影片教程,包括必要的答疑。

FunTester 原創精華
  • 混沌工程、故障測試、Web 前端
  • 服務端功能測試
  • 效能測試專題
  • Java、Groovy、Go
  • 白盒、工具、爬蟲、UI 自動化
  • 理論、感悟、影片
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。

相關文章