建立 java.lang.Thread 例項

在 Java 中建立執行緒有兩種主要方法。實質上,建立一個執行緒就像編寫將在其中執行的程式碼一樣簡單。這兩種方法在定義程式碼的位置上有所不同。

在 Java 中,執行緒由物件表示 - java.lang.Thread 的例項或其子類。所以第一種方法是建立該子類並覆蓋 run() 方法。

注意 :我將使用 Thread 來引用 java.lang.Thread 類和執行緒來引用執行緒的邏輯概念。

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread running!");
        }
    }
}

既然我們已經定義了要執行的程式碼,那麼可以將執行緒建立為:

MyThread t = new MyThread();

執行緒類還包含一個建構函式接受一個字串,將被用作執行緒的名字。在除錯多執行緒程式時,這可能特別有用。

class MyThread extends Thread {
    public MyThread(String name) {
        super(name);
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread running! ");
        }
    }
}

MyThread t = new MyThread("Greeting Producer");

第二種方法是使用 java.lang.Runnable 定義程式碼,它的唯一方法是 run() 。然後, Thread 類允許你在分離的執行緒中執行該方法。要實現此目的,請使用接受 Runnable 介面例項的建構函式建立執行緒。

Thread t = new Thread(aRunnable);

當與 lambdas 或方法引用結合使用時,這可能非常強大(僅限 Java 8):

Thread t = new Thread(operator::hardWork);

你也可以指定執行緒的名稱。

Thread t = new Thread(operator::hardWork, "Pi operator");

實際上,你可以毫無後顧之憂地使用這兩種方法。然而,一般的智慧說使用後者。

對於所提到的四個建構函式中的每一個,還有一個替代方法是接受 java.lang.ThreadGroup 的例項作為第一個引數。

ThreadGroup tg = new ThreadGroup("Operators");
Thread t = new Thread(tg, operator::hardWork, "PI operator");

執行緒組表示一組執行緒。你只能使用 Thread的建構函式將 Thread新增到 ThreadGroup 。該執行緒組則可以用來管理其所有執行緒小號一起,還有執行緒可以從中取得資訊執行緒組

所以為了 sumarize,可以使用以下公共建構函式之一建立 Thread

Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

最後一個允許我們為新執行緒定義所需的堆疊大小。

在建立和配置具有相同屬性或來自相同模式的許多執行緒時,程式碼可讀性通常會受到影響。那時可以使用 java.util.concurrent.ThreadFactory 。此介面允許你通過工廠模式及其唯一方法 newThread(Runnable) 封裝建立執行緒的過程。

class WorkerFactory implements ThreadFactory {
    private int id = 0;

    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r, "Worker " + id++);
    }
}