如何獲取線程對象的名稱呢?
public final String getName():獲取線程的名稱。
如何設置線程對象的名稱呢?
public final void setName(String name):設置線程的名稱
針對不是Thread類的子類中如何獲取線程對象名稱呢?
public static Thread currentThread():返回當前正在執行的線程對象
Thread.currentThread().getName()
public final String getName():獲取線程的名稱。
這個方法是放在寫在自定義線程類中的,也即是Thread的子類:
1 public class MyThread extends Thread { 2 3 public void run() { 4 5 for(int x = 0; x < 100; x++){ 6 System.out.println(getName()+"--"+x); 7 } 8 } 9 10 }
那么,再寫測試類:
1 public class MyThreadDemo1 { 2 3 public static void main(String[] args) { 4 5 // 創建兩個線程對象 6 MyThread mt1 = new MyThread(); 7 MyThread mt2 = new MyThread(); 8 9 mt1.start(); 10 mt2.start(); 11 } 12 13 }
結果:
Thread-1--0
Thread-0--0
Thread-0--1
Thread-0--2。。。
可以看得出,Thread中給線程的默認名稱是Thread-X
那么,為什么默認名稱是Thread-X呢?
首先,MyThread是Thread的子類,所以會先走Thread的無參構造:
class MyThread extends Thread { public MyThread() { super(); }
接下來看Thread關於getName()和setName()的源碼:
1 class Thread { 2 private char name[]; 3 4 public Thread() { 5 init(null, null, "Thread-" + nextThreadNum(), 0); 6 } 走這個nextThreadNum(),//往下看。所以,從這里得到名稱:Thread-0/-1... 7 8 private void init(ThreadGroup g, Runnable target, String name, 9 long stackSize) { 10 init(g, target, name, stackSize, null);//這里又調用了init()方法,看下面 11 } 12 13 private void init(ThreadGroup g, Runnable target, String name, 14 long stackSize, AccessControlContext acc) { 15 //大部分代碼被省略了 16 this.name = name.toCharArray(); //把得到的String類的Thread-0/-1... 轉換成字符數組,然后把數組給private char name[]; 17 } 18 19 public final void setName(String name) { 20 this.name = name.toCharArray(); 21 } //這個是自己更改線程名字走的,直接把輸入的String類的名稱,轉換成字符數組,然后賦值給private char name[]; 22 23 24 private static int threadInitNumber; //0,1,2 25 private static synchronized int nextThreadNum() { 26 return threadInitNumber++; //return 0,1 27 } 28 29 public final String getName() { 30 return String.valueOf(name); 31 }//這里得到的name是String類的 32 }
public final void setName(String name):設置線程的名稱
方法1:無參構造+setXxx() (推薦)
1 public class MyThreadDemo1 { 2 3 public static void main(String[] args) { 4 5 // 創建兩個線程對象 6 MyThread mt1 = new MyThread(); 7 MyThread mt2 = new MyThread(); 8 9 //調用方法設置線程名稱 10 mt1.setName("哈士奇"); 11 mt2.setName("薩摩耶"); 12 13 mt1.start(); 14 mt2.start(); 15 //結果就是同時執行2個打印0-1000的線程 16 } 17 18 }
方法2:帶參構造方法給線程起名字
首先得在自定義線程類中添加:
1 public MyThread() { 2 } 3 4 public MyThread(String name){ 5 super(name); 6 }
因為這個類沒有帶參構造方法,所以得創建,才能使用帶參構造
測試類就可以直接調用構造方法取名:
1 MyThread my1 = new MyThread("哈士奇"); 2 MyThread my2 = new MyThread("薩摩耶");
如果要獲取main方法所在的線程對象的名稱,該怎么辦呢?
遇到這種情況,Thread類提供了這個方法:
public static Thread currentThread():返回當前正在執行的線程對象
System.out.println(Thread.currentThread().getName());
在測試類中添加
System.out.println(Thread.currentThread().getName());//如果類沒有繼承Thread類,又想調用線程的方法,可以通過這個方法調用線程名,並直接調用想要的方法
輸出結果是:main,因為java執行程序默認在main里面