多线程编程(二)——This 和 CurrentThread 的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/swadian2008/article/details/99082145

测试案例如下:

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则永远的指定为当前类的实例对象,它不会发生变化。

猜你喜欢

转载自blog.csdn.net/swadian2008/article/details/99082145