Thread.currentThread().getName()与this.getName()的区别

一:代码示例

  1. 创建继承Thread类的CountOperate
      
    package com.kgf.test;
    
    public class CountOperate extends Thread {
    
    	public CountOperate() {
    		System.out.println("CountOperate---begin");
    		System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
    		System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
    		System.out.println("this.getName()="+this.getName());
    		System.out.println("this.isAlive()="+this.isAlive());
    		System.out.println("CountOperate---end");
    	}
    	
    	@Override
    	public void run() {
    		System.out.println("run---begin");
    		System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
    		System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
    		System.out.println("this.getName()="+this.getName());
    		System.out.println("this.isAlive()="+this.isAlive());
    		System.out.println("Thread.currentThread() == this : " + (Thread.currentThread() == this));
    		System.out.println("run---end");
    	}
    	
    }
    

     

  2. 创建测试类
         
    package com.kgf.test;
    
    public class Run {
    
    	public static void main(String[] args) {
    		CountOperate myThread = new CountOperate();
    		myThread.setName("A");
    		myThread.start();
    	}
    }
    

     

  3.   效果如下:
       
    CountOperate---begin
    Thread.currentThread().getName()=main
    Thread.currentThread().isAlive()=true
    this.getName()=Thread-0
    this.isAlive()=false
    CountOperate---end
    run---begin
    Thread.currentThread().getName()=A
    Thread.currentThread().isAlive()=true
    this.getName()=A
    this.isAlive()=true
    Thread.currentThread() == this : true
    run---end
    

     

  4. 分析原因
          ⑴先说构造方法中的代码结果
                a:
                         Thread.currentThread().getName()=main
                         Thread.currentThread().isAlive()=true

                        上面这个结果是我们在实例化CountOperate对象时,调用无参构造时产生的,
                        并且调用CountOperate构造方法是主线程main。
                b:
                         this.getName()=Thread-0
                         this.isAlive()=false

                         上面这个结果,首先我们需要搞清楚this代表的是什么?它代表的其实就是CountOperate类对象的引用,
                         是个线程类(它继承了Thread线程类),但是这个线程类并没有设置名字,所以Thread默认给了一个Thread-0,
                         默认名字的规则定义如下:
                         
                         因为仅仅是运行构造方法,还未运行线程,所以this.isAlive() = false
          ⑵再说run方法中的代码结果
                a:
                         Thread.currentThread().getName()=A
                         Thread.currentThread().isAlive()=true

                          当前线程名字为A,A是我们手动赋予的myThread.setName("A");,并且它是运行着的
                b:
                        this.getName()=A
                        this.isAlive()=true
                        Thread.currentThread() == this : true

                        因为,我们运行的线程就是MyThread的引用,而this也是MyThread的引用,所以相同,结果也是一样。
  5. 下面我们保持线程类不变,修改我们的测试类
          ⑴修改测试类
                 
    package com.kgf.test;
    
    public class Run {
    
    	public static void main(String[] args) {
    		CountOperate myThread = new CountOperate();
    		Thread thread = new Thread(myThread,"A");
    		thread.start();
    	}
    }
    

          ⑵效果
                 
    CountOperate---begin
    Thread.currentThread().getName()=main
    Thread.currentThread().isAlive()=true
    this.getName()=Thread-0
    this.isAlive()=false
    CountOperate---end
    run---begin
    Thread.currentThread().getName()=A
    Thread.currentThread().isAlive()=true
    this.getName()=Thread-0
    this.isAlive()=false
    Thread.currentThread() == this : false
    run---end
    

          ⑶先说构造方法中的代码结果
                  a:
                          Thread.currentThread().getName()=main
                          Thread.currentThread().isAlive()=true
                          this.getName()=Thread-0
                          this.isAlive()=false

                          上面这个结果是我们在实例化CountOperate对象时,调用无参构造时产生的,
                          并且调用CountOperate构造方法是主线程main。上面这个结果,首先我们需
                          要搞清楚this代表的是什么?它代表的其实就是CountOperate类对象的引用,
                         是个线程类(它继承了Thread线程类),但是这个线程类并没有设置名字,
                         所以Thread默认给了一个Thread-0
          ⑷再说run方法中的代码结果
                   a:
                          Thread.currentThread().getName()=A
                          Thread.currentThread().isAlive()=true
                          this.getName()=Thread-0
                          this.isAlive()=false
                          Thread.currentThread() == this : false

                        从上面我们会发现this 与 Thread.currentThread()不是同一个引用,
                        从测试类我们可以发现,我们启动线程的用的是thread对象,里面
                        我们的构造参数是myThread,赋给Thread类中的属性target,之
                        后在Thread的run方法中调用target.run();此时Thread.currentThread()
                        是Thread的引用newThread, 而this依旧是MyThread的引用,所以是
                        不一样的,打印的内容也不一样。        
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值