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 多线程之生产者和消费者的问题
生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获 ...
随机推荐
- 通过GP加载卫星云图-雷达图-降雨预报图
# ---------------------------------------------------------------------------# MeteorologicalImageLo ...
- MyEclipse 2015免费在线公开课,2月5日开讲
MyEclipse 2015免费在线公开课,2月5日开讲,由MyEclipse官方高级PM Brian Fernandes 主讲. 主讲内容: 更好地支持javascript和技术模块 全新的REST ...
- 优化MySchool数据库(事务、视图、索引)
事务.视图.索引: 事务:当生活逻辑中的“一个步骤”,需要使用多条SQL去完成时,必须使用事务来确保其“完整性“. 视图:简化数据库结构,方便你编写SQL语句(简化SQL语句的编写) 索引:提高“数据 ...
- 【读书笔记】iOS网络-负载
负载指的是在服务的请求响应事务中交换的数据.常见的负载格式包括XML,JSON与HTML. 进入与发出的负载数据存在很多形式与大小.比如,有些开发者会使用原生的字符串或是以分隔符分开的数据与Web S ...
- UILabel和NSAttributedString那些事
注:通常的label用来现实普通的文字.但是,你常常会遇到这样的情况:一段文字中不仅有文字,也有图片,甚至文字中的某段文字与其他的文字的appearance不一致的情况,这样的一段文字就可以称得上是富 ...
- AOP的实现机制
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
- WPF学习之路(十二)控件(Range控件)
ProgressBar 进度条,主要属性:Minimum\Maximun\Value, IsIndeterminate为True时,进度条会循环运转 <Grid> <Grid.Row ...
- C# 得到sqlserver 数据库存储过程,触发器,视图,函数 的定义
经常从 生产环境 到测试环境, 需要重新弄一整套的数据库环境, 除了表结构以及表结构数据,可以用动软代码生成器 生成之外, 像 存储过程,触发器,等,好像没有批量操作的,意义哥哥农比较麻烦, 所以最近 ...
- MySQL substring:字符串截取 (转载)
MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...
- sql server 小记——分区表(上)
我们知道很多事情都存在一个分治的思想,同样的道理我们也可以用到数据表上,当一个表很大很大的时候,我们就会想到将表拆 分成很多小表,查询的时候就到各个小表去查,最后进行汇总返回给调用方来加速我们的查询速 ...