Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别

首先要明白 this.XXX 的使用场景 

使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但是使用this调用getName()方法只能在本类中,而不能在其他类中,更不能在Runnable接口中,所以只能使用Thread.currentThread().getName()获取线程的名称,否则会出现编译时异常。

Thread.currentThread().getName()  ,对象实例.getName() 和 this.getName()区别

在继承 Thread的 run方法中使用this.XXX 和在外部 调用  对象.XXX或者 Thread.currentThread().getXXX,所得出的结果不是一样,如下面代码  为什么不一样


1.new一个自定义的线程,然后把这个线程对象丢给Thread对象构造方法,执行start 才会出现 上面的区别

2.如果是直接new一个自定义对象不交给 Thread线程执行调用 在其内部外部 使用 Thread.currentThread().getName()  ,对象实例.getName() 和 this.getName(),这3个区别 都不存在,都是相同的,因为没有交给Thread执行,直接调用的当前实例本身

第一点代码

  1. class DemoThread extends Thread{
  2. public DemoThread(){
  3. }
  4. @Override
  5. public void run() {
  6. super.run();
  7. System.out.println("内部 this.isAlive" + this.isAlive());
  8. System.out.println("内部 Thread.currentThread().isAlive()"+Thread.currentThread().isAlive());
  9. System.out.println("内部 this.getName" + this.getName());
  10. System.out.println("内部 Thread.currentThread().getName()"+Thread.currentThread().getName());
  11. }
  12. }
  1. public static void main(String[] args) throws InterruptedException {
  2. DemoThread d = new DemoThread();
  3. Thread t1 = new Thread(d);
  4. t1.setName("213");
  5. t1.start();
  6. System.out.println("外部t1.isAlive()"+t1.isAlive());
  7. System.out.println("外部t1.getName()"+t1.getName());
  8. }

结果

外部t1.isAlive()true

外部t1.getName()213

内部 this.isAlivefalse

内部 Thread.currentThread().isAlive()true

内部 this.getNameThread-0

内部 Thread.currentThread().getName()213

如上面图所示  , 在 run方法中调用了 this.getXXX 和  Thread.currentThread().getXXX 完全是不同的结果,而 Thread.currentThread().getXXX 和外部对象t1.getXXX的结果是一致的

总结

首先要清楚t1和d是两个完全不同的对象,他俩之间唯一的关系就是把d传递给t1对象仅仅是为了让t1调用d对象的run方法, 在run方法中 调用this.getXXX 获取的是t1这个父类的状态,父类没有被重写所以跟实例掉的不同的,而在外部t1.getName和Thread.currentThread().getXXX拿到的是d这个子类的实例,所以结果相同,正常的话按道理对象继承父类this也应该实例的,set的话也是可以设置到父类中的,至于为什么线程中会出现这种结果,重点还是这句首先要清楚t1和d是两个完全不同的对象,他俩之间唯一的关系就是把d传递给t1对象仅仅是为了让t1调用d对象的run方法

综上所述  调用线程如果是Thread继承的方式 , 外部使用 Thread.currentThread().getXXX 或者 对象实例.getXXX()  内部则使用Thread.currentThread().getXXX 就不会出现获取不一致的问题

ps一点:

上面的线程实现方法  是new一个自定义的线程,然后把这个线程对象丢给Thread执行 才会出现 上面的区别,如果是直接new一个自定义对象不交给 Thread线程执行调用 在其内部外部 使用 Thread.currentThread().getName()  ,对象实例.getName() 和 this.getName(),这3个区别 都不存在,都是相同的,因为没有交给Thread执行,直接调用的当前实例本身

时间: 2024-10-21 00:24:46

Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别的相关文章

JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别

实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被一个方法.构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息: 实例变量对于类中的方法.构造方法或者语句块是可见的.一般情况下应该把实例变量设为私有.通过使用访问修饰符可以使实例变量对子类可见 实例变量具有默认值.数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默

Thread.currentThread().getName() 和 this.getName()区别详解

Thread.currentThread().getName() 和 this.getName()区别详解 <<Java多线程编程核心技术>> 这本书里说到了这个:  Thread.currentThread().getName() this.getName() 他俩是有区别的,得到的效应是不一样的,首先,从直观上来说: Thread.currentThread().getName() 是一个静态方法 this.getName()是一个实例方法 实例方法,一般情况下是:反映这个实例

关于Thread.currentThread().getName和this.getName()的问题

package mythread; public class CountOperate extends Thread{     public CountOperate(){         System.out.println("CountOperate---begin");         System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getNam

Java多线程之this与Thread.currentThread()的区别

package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.println("CountOperate---begin"); System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());//获取线程名 System.ou

Thread.currentThread()与this的区别

Thread.currentThread()与this的区别: 1.Thread.currentThread().getName()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引用. 2.使用范围: Thread.currentThread().getName()在两种实现线程的方式中都可以用.   this.getName()只能在继承方式中使用.因为在Thread子类中用this,this代表的是线程对象.   如果你在Runnable实现类中用

关于Thread.currentThread()和this的差异

重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: 1 public class MyThread02 extends Thread { 2 public MyThread02() { 3 System.out.println("init curr: " + Thread.currentThread().getName()); 4 System.out.println("init this: "+this.getName()); 5 } 6 @Override

Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream

Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第二个参数(bool)表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量. C

关于js函数,方法,对象实例的一些说明

朋友们大家好,好久没有更新文章了,最近正好有空就想着写点什么吧,加上这段时间总是能听到一些朋友们问关于js函数,方法,对象实例到底有什么区别这个问题,所以今天就献丑来简单说明一些吧! 其实这些主要都是一些概念上的东西,在这里还是推荐大家多看看诸如<JavaSript权威指南>,<JavaScript高级编程>之类的书籍,当然这些概念如果用代码写出来我相信大家也都还是能够知道的,所以下面我就用文字和代码举一些简单的例子进行说明: 函数:简单的说函数就是,使用function关键字定义

关于 Thread.currentThread()

currentThread()  到底是什么? 其实currentThread() 只是Thread 的一个静态方法.返回的正是执行当前代码指令的线程引用: /** * Returns a reference to the currently executing thread object. * * @return the currently executing thread. */ public static native Thread currentThread(); 换句话说, Threa