博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别
阅读量:5085 次
发布时间:2019-06-13

本文共 2274 字,大约阅读时间需要 7 分钟。

首先要明白 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执行,直接调用的当前实例本身

转载于:https://www.cnblogs.com/signheart/p/922dcf75dd5fe6b418d4475af89c4664.html

你可能感兴趣的文章
MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Filtering Sets
查看>>
Java开发代码性能优化总结
查看>>
php 获取某个月的周次信息
查看>>
redis 随笔
查看>>
Java重写《C经典100题》 --30
查看>>
线程池
查看>>
饭店点餐系统
查看>>
bzoj2259 [Oibh]新型计算机
查看>>
centos7下部署iptables环境纪录(关闭默认的firewalle)
查看>>
Sed与Awk 学习笔记
查看>>
【Android Studio】Gradle配置及问题解决
查看>>
实验三-查找与排序-5(选做,加分) 补做
查看>>
加快FineReport报表设计的几个心得体会
查看>>
九九乘法表
查看>>
内存泄露:*.hprof
查看>>
/etc/profile、/etc/bashrc、~/.bash_profile、~/.bash_bashrc
查看>>
查询表中昨天和今天的数据
查看>>
将程序集添加到“全局程序集高速缓存”
查看>>
2017-07-31(触发器,包,游标练习)
查看>>
Oracle PL/SQL Developer - Day 1
查看>>