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