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

 

Java多线程中thread.getname()和thread.currentThread().getName();的去别的更多相关文章

  1. Java多线程中的Runnable和Thread

    摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...

  2. java 多线程中的wait方法的详解

    java多线程中的实现方式存在两种: 方式一:使用继承方式 例如: PersonTest extends Thread{ String name; public PersonTest(String n ...

  3. Java多线程中的竞争条件、锁以及同步的概念

    竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作 ...

  4. Java多线程中的死锁

    Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...

  5. Java多线程中的常用方法

    本文将带你讲诉Java多线程中的常用方法   Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...

  6. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  7. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

  8. java多线程中最佳的实践方案是什么?

    java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...

  9. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

随机推荐

  1. Loadrunner 计算保留两位小数不四舍五入

    有时候在测试过程中会截取返回值,当你截取的值不是最终的值,需要进行计算后才能使用并且需要保留两位小数,不进行四舍五入的计算: 此时 我使用了各种办法,但是最终我采用了一种最直接,最暴力的方法就是先乘后 ...

  2. JS与小程序页面生命周期

    Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, /** * 生命周 ...

  3. GoogLeNet网络的Pytorch实现

    1.文章原文地址 Going deeper with convolutions 2.文章摘要 我们提出了一种代号为Inception的深度卷积神经网络,它在ILSVRC2014的分类和检测任务上都取得 ...

  4. JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!

    主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...

  5. 【搜索/tarjan找环】zznu-简单环路

    简单环路 题目描述 有一个N x M 大小的地图,地图中的每个单元包含一个大写字母. 若两个相邻的(这里的相邻指“上下左右”相邻)点上的字母相同,我们可以用线段连接这两个点. 若存在一个包含同一字母的 ...

  6. 【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重

    L2-002. 链表去重 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须 ...

  7. Redis的下载、安装及启动

    一.下载Redis 1. redis 的下载路径 https://pan.baidu.com/s/1tdMzOlcTlFC7Z3a3I_59hQ 提取码:5tgy 二.安装Redis cd到当前解压目 ...

  8. 织梦cms导航高亮显示栏目及首页的方法

    直奔主题了,高亮显示教程适用于您具有一定的CSS基础才可以了,前提把高亮显示的样式写好,然后再开始高亮显示标签适用. <li {dede:field name=typeid runphp=&qu ...

  9. python pip获取所有已安装的第三包

    pip freeze > requirements.txt # 生成txt 文件 pip install -r requirements.txt # 别人使用时可以直接安装所有的包 [progr ...

  10. Spring Boot学习--spring-boot-starter-parent及starters(转)

    在官方文档的第三部分的13块讲述了引用的管理,官方推荐的是使用Maven和Gradle. 我一直在用的是maven,而且使用maven有些优势–spring-boot-starter-parent,这 ...