Java curentThread()方法的作用

2020-07-16 10:04:38
curentThread() 方法可返回程式碼段正在被哪個執行緒呼叫的資訊。下面通過一個範例進行說明。

例 1

假設在主執行緒中有如下程式碼:
public class Run1
{
    public static void main(String[] args)
    {
        //呼叫currentThread()方法輸出當前執行緒名稱
        System.out.println(Thread.currentThread().getName());
    }
}

執行後在控制台會輸出“main”,這說明 main() 方法被名為 main 的執行緒呼叫。

上例中 currentThread() 方法在主執行緒中,再來看一個線上程類中呼叫該方法的範例。假設 MyThread06 執行緒類的程式碼如下:
package ch14;
public class MyThread06 extends Thread
{
    public MyThread06()
    { 
        //呼叫currentThread()方法輸出當前執行緒名稱
        System.out.println("構造方法的列印:"+Thread.currentThread().getName()); 
     } 
     @Override 
     public void run()
     { 
        //呼叫currentThread()方法輸出當前執行緒名稱
        System.out.println("run方法的列印:"+Thread.currentThread().getName()); 
     } 
}

接下來編寫主執行緒程式碼,建立 MyThread06 執行緒範例並啟動執行緒。程式碼如下:
package ch14;
public class Test09
{
    public static void main(String[] args)
    {
        MyThread06 mythread=new MyThread06(); 
        mythread.start(); 
        //mythread.run();
    }
}

執行主執行緒將看到如下所示的結果。
構造方法的列印:main
run方法的列印:Thread-0

從執行結果可以發現,MyThread06 類別建構函式是被 main 執行緒呼叫的,而 run() 方法是被名稱為 Thread-0 的執行緒呼叫的,run() 方法是自動呼叫的方法。

對主執行緒的程式碼進行簡單修改,使用“mythread.run()”程式碼來啟動執行緒,此時的執行結果如下所示。
構造方法的列印:main
run方法的列印:main

和之前的執行結果進行對比可以發現,此時 run() 方法的列印也是 main 執行緒呼叫的。

例 2

再來測試一個更複雜的情況。假設 MyThread07 執行緒類的程式碼如下:
package ch14;
public class MyThread07 extends Thread
{
    public MyThread07()
    { 
        System.out.println("構造方法---開始"); 
        System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName()); 
        System.out.println("this.getName()="+this.getName()); 
        System.out.println("構造方法---結束"); 
    } 
    @Override 
    public void run()
    { 
        System.out.println("run()方法---開始"); 
        System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName()); 
        System.out.println("this.getName()="+this.getName()); 
        System.out.println("run()方法---結束"); 
    } 
}

如上述程式碼所示,在 MyThread07 類的構造方法和 run() 方法中都呼叫了 currentThread() 方法。那麼在啟動該執行緒時構造方法的執行緒名稱和 run() 方法中的執行緒名稱是否相同呢?帶著上面的疑問,我們來編寫一個主執行緒對 MyThread07 類進行測試。主執行緒程式碼如下:
package ch14;
public class Test10
{
    public static void main(String[] args)
    {
        //建立MyThread07執行緒範例
        MyThread07 myThread=new MyThread07();
        //建立一個執行緒
        Thread t1=new Thread(myThread);
        //設定執行緒的名稱
        t1.setName("A");
        //啟動執行緒
        t1.start();
    }
}

執行後的輸出結果如下:
構造方法---開始
Thread.currentThread().getName()=main
this.getName()=Thread-0
構造方法---結束
run()方法---開始
Thread.currentThread().getName()=A
this.getName()=Thread-0
run()方法---結束

從結果可以發現,雖然 this.getName() 方法返回的都是 Thread-0,但是在構造方法中使用的即是 main 執行緒,而在 run() 方法中使用的是 A 執行緒。