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 執行緒。