java 22 - 5 多线程之获取和设置线程对象的名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());

输出结果是:main,因为java执行程序默认在main里面

以上是关于java 22 - 5 多线程之获取和设置线程对象的名称的主要内容,如果未能解决你的问题,请参考以下文章

java 22 - 16 多线程之生产者和消费者的问题

java 22 - 17 多线程之等待唤醒机制(接16)

Java--多线程之join,yield,sleep;线程优先级;定时器;守护线程

java 22 - 9 多线程之 代码实现的方式2

java 22 - 7 多线程之控制线程的方法

java 25 - 5 网络编程之多线程实现聊天室