java设置对象的名字_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 extendsThread {2

3 public voidrun() {4

5 for(int x = 0; x < 100; x++){6 System.out.println(getName()+"--"+x);7 }8 }9

10 }

那么,再写测试类:

1 public classMyThreadDemo1 {2

3 public static voidmain(String[] args) {4

5 //创建两个线程对象

6 MyThread mt1 = newMyThread();7 MyThread mt2 = newMyThread();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 extendsThread {publicMyThread() {super();

}

接下来看Thread关于getName()和setName()的源码:

1 classThread {2 private charname[];3

4 publicThread() {5 init(null, null, "Thread-" + nextThreadNum(), 0);6 } 走这个nextThreadNum(),//往下看。所以,从这里得到名称:Thread-0/-1...

7

8 private voidinit(ThreadGroup g, Runnable target, String name,9 longstackSize) {10 init(g, target, name, stackSize, null);//这里又调用了init()方法,看下面

11 }12

13 private voidinit(ThreadGroup g, Runnable target, String name,14 longstackSize, AccessControlContext acc) {15 //大部分代码被省略了

16 this.name = name.toCharArray(); //把得到的String类的Thread-0/-1... 转换成字符数组,然后把数组给private char name[];

17 }18

19 public final voidsetName(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 intnextThreadNum() {26 return threadInitNumber++; //return 0,1

27 }28

29 public finalString getName() {30 returnString.valueOf(name);31 }//这里得到的name是String类的

32 }

public final void setName(String name):设置线程的名称

方法1:无参构造+setXxx() (推荐)

1 public classMyThreadDemo1 {2

3 public static voidmain(String[] args) {4

5 //创建两个线程对象

6 MyThread mt1 = newMyThread();7 MyThread mt2 = newMyThread();8

9 //调用方法设置线程名称

10 mt1.setName("哈士奇");11 mt2.setName("萨摩耶");12

13 mt1.start();14 mt2.start();15 //结果就是同时执行2个打印0-1000的线程

16 }17

18 }

方法2:带参构造方法给线程起名字

首先得在自定义线程类中添加:

1 publicMyThread() {2 }3

4 publicMyThread(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里面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值