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的子类:
public class MyThread extends Thread {
public void run() {
for(int x = 0; x < 100; x++){
System.out.println(getName()+"--"+x);
}
}
}
那么,再写测试类:
public class MyThreadDemo1 {
public static void main(String[] args) {
// 创建两个线程对象
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
mt1.start();
mt2.start();
}
}
结果:
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()的源码:
class Thread {
private char name[];
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
} 走这个nextThreadNum(),//往下看。所以,从这里得到名称:Thread-0/-1...
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null);//这里又调用了init()方法,看下面
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) {
//大部分代码被省略了
this.name = name.toCharArray(); //把得到的String类的Thread-0/-1... 转换成字符数组,然后把数组给private char name[];
}
public final void setName(String name) {
this.name = name.toCharArray();
} //这个是自己更改线程名字走的,直接把输入的String类的名称,转换成字符数组,然后赋值给private char name[];
private static int threadInitNumber; //0,1,2
private static synchronized int nextThreadNum() {
return threadInitNumber++; //return 0,1
}
public final String getName() {
return String.valueOf(name);
}//这里得到的name是String类的
}
public final void setName(String name):设置线程的名称
方法1:无参构造+setXxx() (推荐)
public class MyThreadDemo1 {
public static void main(String[] args) {
// 创建两个线程对象
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
//调用方法设置线程名称
mt1.setName("哈士奇");
mt2.setName("萨摩耶");
mt1.start();
mt2.start();
//结果就是同时执行2个打印0-1000的线程
}
}
方法2:带参构造方法给线程起名字
首先得在自定义线程类中添加:
public MyThread() {
}
public MyThread(String name){
super(name);
}
因为这个类没有带参构造方法,所以得创建,才能使用带参构造
测试类就可以直接调用构造方法取名:
MyThread my1 = new MyThread("哈士奇");
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里面
java 22 - 5 多线程之获取和设置线程对象的名称的更多相关文章
- java 22 - 6 多线程之线程调度和设置线程的优先级
线程调度 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令. 那么Java是如何对线程进行调用的呢? 线程有两种调 ...
- Java并发学习之二——获取和设置线程信息
本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Prio ...
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- java 从spring容器中获取注入的bean对象
java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...
- java 22 - 7 多线程之控制线程的方法
线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设 ...
- java 22 - 20 多线程之线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...
- java 22 - 18 多线程之 线程的状态转换、线程组
线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起. 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...
- java 22 - 16 多线程之生产者和消费者的问题
生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获 ...
随机推荐
- 【C语言】C语言局部变量和全局变量
目录: [局部变量] · 定义 · 作用域 · 生命周期 · 用static修饰局部变量 [全局变量] · 定义 · 作用域 · 生命周期 1.局部变量 · 定义 在函数(代码块)内部定义的变量称为局 ...
- 网络热恋之XML解析
XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...
- iOS 简单动画 序列帧动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"旭宝爱吃 ...
- 转载:设置html页面不让浏览器缓存的方法
本文是转载文章,只是方便自己记录. 在html页面head标签之间添加以下标识可以避免大多数浏览器缓存: <meta http-equiv="Pragma" content= ...
- Java集合框架的接口和类层次关系结构图
Collection和Collections的区别 首先要说的是,"Collection" 和 "Collections"是两个不同的概念: 如下图所示,&qu ...
- mysql执行计划
烂sql不仅直接影响sql的响应时间,更影响db的性能,导致其它正常的sql响应时间变长.如何写好sql,学会看执行计划至关重要.下面我简单讲讲mysql的执行计划,只列出了一些常见的情况, ...
- SSRS报表连接超时的问题
这段时间遇到一个问题就是ReportService 中采用了远程连接的报表偶尔会断开连接,导致报表导出异常,查阅了很多资料,几天来就是断断续续的终于解决了这个问题,下面把一些解决的点一一展示出来,便于 ...
- 利用PHPMailer 来完成PHP的邮件发送 #转载自:大菜鸟在云端#
利用PHPMailer 来完成PHP的邮件发送 1.首先是下载PHPMailer http://code.google.com/a/apache-extras.org/p/phpmailer/ 2.解 ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- Linux工具之man手册彩色页设置
说明: 对于我们开发人员或者运维工程师来说,经常要查询某个系统命令或者C函数接口的使用方法,最好的最专业的资料就是man手册,通过一些设置可以让man手册页面显示适当颜色,方便阅读,增强美观性. 设置 ...