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里面

时间: 2024-08-07 20:51:04

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

java 22 - 6 多线程之线程调度和设置线程的优先级

线程调度 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令. 那么Java是如何对线程进行调用的呢? 线程有两种调度模型: 分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些. Java使用的是抢占式调度模型. 既然线程设有设置优先级,

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

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

线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设置的是休眠1秒),再进行一轮. 一轮:(如果测试类调用了3个线程,那么就是随机运行3次为一轮) 如: 哈士奇:1,日期:Wed Oct 05 21:01:19 CST 2016 短尾猫:1,日期:Wed Oct 05 21:01:19 CST 2016 萨摩耶:1,日期:Wed Oct 05 21:

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

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5

java 22 - 18 多线程之 线程的状态转换、线程组

线程的状态转换图解:..博客暂时不能上传图片 线程的线程组: 线程组: 把多个线程组合到一起.    它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 public class MyRunnable implements Runnable { public void run() { for(int x = 0; x < 10 ; x++){ System.out.println(x); } } } 先看看默认状态下,线程都会保存在哪个线程

java 22 - 12 多线程之解决线程安全问题的实现方式1

从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备,所以肯定出问题. 如何解决问题: 原因A.B肯定不能改变,所以只能改变原因C 解决问题思路: 如果把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行这个整体的时候,别的线程不能执行. 这时候就用到了java提供的:同步机制 同步代码块: synchronized(对象){  需要同步的代码

java 22 - 11 多线程之模拟电影院售票口售票

使用多线程实现的第二种方式: 首先创建自定义类 1 public class SellTicket implements Runnable { 2 // 定义100张票 3 private int ticket = 100; 4 5 public void run() { 6 7 //假设一直在售票 8 while(true){ 9 //现实中买票时,都会有延迟的,所以让线程休息下 10 try { 11 Thread.sleep(100); 12 } catch (InterruptedExc

java 22 - 4 多线程的代码实现的方式1

需求:我们要实现多线程的程序. 如何实现呢? 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序. 但是,Java可以去调用C/C++写好的程序来实现多线程程序.  由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西, 然后提供一些类供我们使用.我们就可以实现多线程程序了.那么Java提供的类是什么呢?Thread类通过查看API,我们

java 22 - 3 多线程的概述以及其它所涉及的东西(看)

1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在. 2:什么是进程? 通过任务管理器我们就看到了进程的存在. 而通过观察,就可以发现只有运行的程序才会出现进程. 进程:就是正在运行的程序. 进程是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 3:多进程有什么意义呢? 单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情. 举例:一边玩游戏(游戏进程),一边听音乐(音乐进程). 也就是说现在的计算机都是支持多