public class ThreadDemo1 extends Thread{
public ThreadDemo1() {
System.out.println("---------构造方法start------------------------------");
System.err.println("currentThread().getName()-我是:"+Thread.currentThread().getName());
System.err.println("this.getName()-我是:"+this.getName());
System.out.println("---------构造方法end------------------------------");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadDemo1 t = new ThreadDemo1();
Thread t1 = new Thread(t);
t1.setName("t1");
t1.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("*************run start*************");
System.err.println("currentThread().getName()-我是:"+Thread.currentThread().getName());
System.err.println("this.getName()-我是:"+this.getName());
System.out.println("*************run end*************");
}
}
输出:
---------构造方法start------------------------------
currentThread().getName()-我是:main
this.getName()-我是:Thread-0
---------构造方法end------------------------------
*************run start*************
currentThread().getName()-我是:t1
this.getName()-我是:Thread-0
*************run end*************
结论:
currentThread().getName()是指当前线程,哪个线程执行这个代码块。
this.getName()是指当前对象。在这个demo中是对象t,t的getName也就是打印的Thread-0
分析:
1. 在构造方法执行的时候,构造方法start
currentThread().getName()-我是:main -->这行输出是因为构造方法public ThreadDemo1() 是main函数执行的,所以当前线程的getName也就是是main线程。
this.getName()-我是:Thread-0 -->这行输出的Thread0是怎么来的呢?请看Thread类的构造函数:(在eclipse中,在此行代码Thread t1 = new Thread(t);
点击选中new Thread(t)的Thread单词,然后按住Ctrl,再单击Thread单词即可进入。)
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
2. run方法执行的时候run start
输出为:
currentThread().getName()-我是:t1
this.getName()-我是:Thread-0
当执行run方法时,
currentThread().getName(),的当前线程是t1,所以输出也是t1;
this.getName(),的当前对象是t,因为代码中没有给t setName,所以打印的是Thread构造函数中的默认线程名称。
假如读者想给t setName,不想用Thread类给的默认线程名称,可以在main方法中添加t.setName(“hubotao”);
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadDemo1 t = new ThreadDemo1();
t.setName("hubotao"); //添加此行代码
Thread t1 = new Thread(t);
t1.setName("t1");
t1.start();
}
打印结果会是这样:
---------构造方法start------------------------------
currentThread().getName()-我是:main
this.getName()-我是:Thread-0
---------构造方法end------------------------------
*************run start*************
currentThread().getName()-我是:t1
this.getName()-我是:hubotao -->这行打印结果有所不同
*************run end*************