参考文章:
http://www.cnblogs.com/huangyichun/p/6071625.html
程序一:
public class Run1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()); //main方法被名字为main的线程调用
}
}
结果很简单,我已经在注释中表明结果了
程序二:
public class MyThread extends Thread {
//类的构造函数是被main线程调用
public MyThread() {
System.out.println("构造方法的打印" + Thread.currentThread().getName());
}
//因为run是自动被调用的方法 所以start()的时候就是被线程Thread-0调用 异步处理
//在程序中直接调用run方法,那是被main线程调用 同步处理
@Override
public void run() {
System.out.println("run方法的打印" + Thread.currentThread().getName());
}
//为什么会是Thread-0
/*
部分源代码:
* public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
*
* 从源代码我们就可以发现 "Thread-" + nextThreadNum()
*
* */
public class Run2 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
//mythread.start();
mythread.run();
}
}
需要注意的地方就是调用strat()和run()方法之间的区别
程序三:
public class CountOperate extends Thread {
public CountOperate() {
System.out.println("CountOperate---begin");
System.out.println("Thread.currentThread().getName()="
+ Thread.currentThread().getName());
System.out.println("this.getName()=" + this.getName());
System.out.println("Thread.currentThread()==this :"+ (Thread.currentThread() == this));
System.out.println("CountOperate---end");
}
@Override
public void run() {
System.out.println("run---begin");
System.out.println("Thread.currentThread().getName()="
+ Thread.currentThread().getName());
System.out.println("this.getName()=" + this.getName());
System.out.println("Thread.currentThread()==this :"+ (Thread.currentThread() == this));
System.out.println("run---end");
}
}
public class Run {
public static void main(String[] args) {
CountOperate c = new CountOperate();
//c.start();//千万不要多次调用start() 不然程序是会报错的
/*
输出结果如下:
CountOperate---begin
Thread.currentThread().getName()=main //构造函数被main线程调用
this.getName()=Thread-0 //this.getName()调用的是父类的getName,因此返回Thread-0
Thread.currentThread()==this :false //前者是main线程 后者是类构造函数线程 因此为false
CountOperate---end
run---begin
Thread.currentThread().getName()=Thread-0 //当前运行是new CountOperate()创建的线程
this.getName()=Thread-0 //this 指的就是new CountOperate()创建的线程
Thread.currentThread()==this :true // 因此 结果为true
run---end
* */
//c.run();
/*
输出结果:
CountOperate---begin
Thread.currentThread().getName()=main
this.getName()=Thread-0
Thread.currentThread()==this :false
CountOperate---end
run---begin
Thread.currentThread().getName()=main //如果直接调用run() main线程 而不是线程规划器中的子线程
this.getName()=Thread-0 // this 指的还是new CountOperate()创建的线程
Thread.currentThread()==this :false
run---end
* */
Thread t1 = new Thread(c);
//t1.setName("A");
t1.start();
/*
输出结果:
CountOperate---begin
Thread.currentThread().getName()=main
this.getName()=Thread-0
Thread.currentThread()==this :false
CountOperate---end
run---begin
Thread.currentThread().getName()=Thread-1 //这里线程规划器又重新创建了一个子线程。 如果t1.setName("A"); 那么其结果就是A
this.getName()=Thread-0 //这里this 指的还是new CountOperate()创建的线程实例 而不是new Thread(c)创建的那个实例即c
Thread.currentThread()==this :false
run---end
* */
}
}
这里在结合java源代码进行解释:
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
new Thread(c)会将thread应用对象绑定到一个private的target上面,在t1被执行的时候即t1.run(),它会调用target.run()方法,也就说它是直接调用thread对象的run方法,因此在run方法被执行的时候,this.getName()实际上返回的是target.getName(),而Thread.currentThred().getName()实际上是t1.getName()