原文链接:http://www.cnblogs.com/signheart/p/922dcf75dd5fe6b418d4475af89c4664.html

使用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执行,直接调用的当前实例本身
 

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

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

    实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被 ...

  2. Java多线程中thread.getname()和thread.currentThread().getName();的去别

    首先要明白 this.XXX 的使用场景 使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但 ...

  3. Thread.currentThread与this的区别

    在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...

  4. Java的Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区别???

    最近在看Java多线程这本书,但是发现里面有个概念自己搞不清楚.就是Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区 ...

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

    currentThread的详解 currentThread方法是Thread类的一个静态方法,用来获取当前运行的代码段,正在被哪个线程调用.我们先来看一眼源码. 是一个native方法.直接与系统层 ...

  6. Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术

      package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...

  7. Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别

    总结起来一句话:在Thread中调用this其实就是调用Thread私有Runnable类型的target,target是Thread类的一个属性,而Thread.currentThread()是指新 ...

  8. Thread.currentThread()和this的区别

    1. Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用. 2. ...

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

    重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: public class MyThread02 extends Thread { public MyThread02() { System.o ...

随机推荐

  1. 使用for...of 优点,代替for...in,forEach和for循环

    来自阮一峰ES6标准: http://es6.ruanyifeng.com/#docs/iterator

  2. nms

    nms函数是保留选框中得分最高的那一个 Python代码如下 def nms(boxes, threshold, method): """ boxes: [x1, y1, ...

  3. tornado-模板,转义,上传静态文件

    class MainHandler(tornado.web.RequestHandler): def get(self): self.render("ces.html") def ...

  4. 有关Firefox/Chrome的问题汇总

    安装的附加组件因未经验证而被 Firefox 禁用,我该怎么办 如果您已安装的附加组件因未经验证而被禁用了,建议您联系附加组件开发者或提供给您附加组件的人,看看他们能不能提供新版经过验证的附加组件.您 ...

  5. 黑盒测试用例设计——PICT

    一.简单用法   在PICT安装目录下新建一个txt文本.把参数填入txt文本中.[内容包括(注意格式<ParamName> : <Value1>, <Value2> ...

  6. JAVA Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )

    < 1 > 实体类 Person package java_spring.modle; /** * 一个实体类( Person ) */ public class Person { pri ...

  7. 使用JsonViewer来格式化json字符串

    1. 在线转换 https://www.bejson.com/jsonviewernew/ ==>格式化 2. 使用notepad ++ 的jsonViewer插件 下载地址 http://ww ...

  8. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  9. windows系统安装参数

    winnt32 /dudisable /s:. /unattend:winnt.sif /makelocalsource /tempdrive:C /syspart:C 以上各参数解释如下: /dud ...

  10. UI5-文档-4.27-Mock Server Configuration

    我们只是在一个真实的服务上运行我们的应用程序,但是对于开发和测试我们的应用程序,我们不希望依赖于“真实”服务的可用性,或者在数据服务所在的系统上增加额外的负载. 这个系统就是所谓的后端系统,我们现在将 ...