zoukankan      html  css  js  c++  java
  • java 22

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

    何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
  • 相关阅读:
    windows下面编译redis5.0.5
    在ASP.NET Core 2.x中获取客户端IP地址
    https网站访问第三方https网站时候报错: The request was aborted:Could not create SSL/TLS secure channel.
    大量日志Login failed for user 'sa'. 原因: 密码与所提供的登录名不匹配。 [客户端: x.x.x.x] 导致Sql Server 的ErrorLog文件过大几十G
    一次清除SQL SERVER错误日志(ErrorLog)的体会!
    notepad++正则抽取所有符合条件的字符串
    Android编译执行envsetup.sh,产生工具命令m、mm、mmm、mmma、tapas 、croot、cgrep、jgrep、 resgrep、godir
    全志Tina_dolphin播放音视频裸流(h264,pcm)验证
    全志Linux Tina编译demoOmxVdec错误
    linux epoll学习
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5932665.html
Copyright © 2011-2022 走看看