版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
测试案例如下:
public class Mythread extends Thread {
public Mythread(){
System.out.println("构造方法开始...");
System.out.println("currentThread结果:"+Thread.currentThread().getName());
System.out.println("currentThread线程是否存活:"+Thread.currentThread().isAlive());
System.out.println("this结果:"+this.getName());
System.out.println("this线程是否存活:"+this.isAlive());
System.out.println("构造方法结束...");
}
@Override
public void run() {
System.out.println("Run方法开始...");
System.out.println("currentThread结果:"+Thread.currentThread().getName());
System.out.println("currentThread线程是否存活:"+Thread.currentThread().isAlive());
System.out.println("this结果:"+this.getName());
System.out.println("this线程是否存活:"+this.isAlive());
System.out.println("Run方法结束...");
}
public static void main(String[] args) {
Mythread mythread = new Mythread();
Thread thread = new Thread(mythread);
thread.setName("A线程");
thread.start();
}
}
运行结果:
解析运行结果:
1、可以看到This.getName() 的线程名字为 Thread - 0,这是因为,在创建线程时如果没有指定线程名,构造方法会自动创建一个线程名字,构造名字的源码如下:
// Thread构造方法
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
2、this指定的永远是当前Mythread的实例化对象,从运行结果来看,实例化Mythread的线程一直处于死亡状态,因为程序一直没有调用start()方法去开启Mythread线程。
请注意这里开启的线程,并不是Mythread的线程,而是new Thread(myhTread) 新实例的线程。
Mythread mythread = new Mythread();
Thread thread = new Thread(mythread);
thread.setName("A线程");
thread.start();
3、CurrentThread 指的永远是当前正在运行的线程,因此你可以发现,它的线程状态永远是存活的。
注:当然这样说有点绝对,但在本例中,程序要打印出语句,一定是需要存活线程去执行的,所以它永远存活。
调用构造方法的是main线程,而执行Run()方法的是new Thread(myhTread) 新实例的线程,即“A线程”(这个是我们自己设置的,没有使用默认值);
可以看得到CurrentThread 指定的对象在同一个类中,它的指定的对象随着执行线程的不同而不同,是变化的;而this则永远的指定为当前类的实例对象,它不会发生变化。