java 22 - 5 多線程之獲取和設置線程對象的名稱


如何獲取線程對象的名稱呢?
  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里面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM