如何获取线程对象的名称呢?
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里面