聊聊Java中的Thread類

Thread類是位於java.lang包下,java.lang包是系統自動隱式導入的,也就是說開發人員無需用import語句導入就可以使用其中的類。

thread是程序中的執行線程,Java虛擬機允許應用程序具有多個併發運行的執行線程。

每個線程都有一個優先級,優先級高的線程比優先級低的線程優先執行。每個線程可能會也可能不會被標記爲守護(daemon)線程。當某些線程(比如線程A)中運行的代碼創建新的Thread對象(線程B)時,新線程(線程B)的優先級被設置爲等於創建線程(線程A)的優先級。並且當且僅當創建線程(線程A)是一個守護線程時,新線程(線程B)纔是守護線程。

當Java虛擬機啓動的時候,通常只有一個非守護線程(它通常調用某個指定類的main方法)。Java虛擬機繼續執行線程,直到出現下面情況之一:

  • 調用了Runtime類的exist()方法,並且安全管理器(security manager)已允許進行退出操作;
  • 所有非守護線程都已死亡;
  • 調用run方法正常返回;
  • 拋出傳播到run方法之外的異常。

有兩種方法可以創建一個新的執行線程。一是聲明一個Thread類的子類,這個子類應該重寫(override)Thread類的run方法。然後可以創建並啓動子類的一個實例。例如,計算大於指定值的素數的線程可以寫成如下形式:

class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

下面的代碼創建一個線程並啓動運行:

PrimeThread p = new PrimeThread(143);
p.start();

另一種創建線程的方式是聲明一個實現了Runnable接口的類,然後該類實現run方法,創建這個類的實例,然後這個實例作爲參數傳遞給創建的Thread的構造方法,並啓動。下面是上述例子的另一種實現方式:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

下面的代碼創建一個線程並啓動運行:

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

每個線程都有一個用於標識的名稱,多個線程可以有相同的名稱。如果創建線程的時候沒有指定名稱,則爲其生成一個名稱。默認名稱爲Thread-0,Thread-1,…

public Thread(String name) {
    init(null, null, name, 0);
}

public Thread() {
    init(null, null, "Thread-" + nextThreadNum(), 0);
}

比如,排查線上問題時,我們通常需要查看日誌文件,這時候可以根據線程名稱查看某個線程在一段時間內執行的業務邏輯。

學習技術就要讀第一手資料,比如讀Javadoc。以上內容大部分翻譯自java.lang.Thread類源碼的註釋文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章