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

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

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

创建线程实例

public class CountOperate extends Thread {
    public CountOperate() {
        System.out.println("构造函数:Thread.currentThread().getName()=" + Thread.currentThread().getName());
        System.out.println("构造函数:this.getName()=" + this.getName());
    }

    @Override
    public void run() {
        System.out.println("run方法:Thread.currentThread().getName()=" + Thread.currentThread().getName());
        System.out.println("run方法:this.getName()=" + this.getName());
    }
}

开启线程

public class Run {
    public static void main(String[] args) {
        CountOperate c = new CountOperate();
        Thread t1 = new Thread(c);
        t1.setName("A");
        t1.start();
        System.out.println("对象实例.getName()=" + t1.getName());
        System.out.println("对象实例:Thread.currentThread().getName()=" + Thread.currentThread().getName());
    }
}

运行结果:请忽略构造函数输出

构造函数:Thread.currentThread().getName()=main
构造函数:this.getName()=Thread-0
对象实例.getName()=A
对象实例:Thread.currentThread().getName()=main
run方法:Thread.currentThread().getName()=A
run方法:this.getName()=Thread-0

在 run方法中调用了 this.getName和 Thread.currentThread().getName完全是不同的结果,而 Thread.currentThread().getName和对象实例t1.getName的结果是一致的

总结:

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

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

例如将Run改成这样:

public class Run {
    public static void main(String[] args) {
        CountOperate c = new CountOperate();
        /*Thread t1 = new Thread(c);
        t1.setName("A");
        t1.start();*/
        c.setName("A");
        c.start();
        System.out.println("对象实例.getName()=" + c.getName());
        System.out.println("对象实例:Thread.currentThread().getName()=" + Thread.currentThread().getName());
    }
}

运行结果:

构造函数:Thread.currentThread().getName()=main
构造函数:this.getName()=Thread-0
对象实例.getName()=A
对象实例:Thread.currentThread().getName()=main
run方法:Thread.currentThread().getName()=A
run方法:this.getName()=A
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值