Thread.currentThread.getName和this.getName的区别

this.getName

this的意思是代表当前对象的。而this在线程的环境下,代表的是当前线程实例对象本身。所以this.getName是当前线程实例对象的线程名称是什么。

Thread.currentThread.getName

Thread.currentThread.getName意思是在当前代码块中执行的线程名称是什么。
例子

public class MyThread extends Thread {
    
    public MyThread () {
        System.out.println("MyThread ---begin");
        System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive()=" + Thread.currentThread().isAlive());
        System.out.println("this.getName()=" + this.getName());
        System.out.println("this.isAlive()=" + this.isAlive());
        System.out.println("MyThread ---end");
    }

    @Override
    public void run() {
        System.out.println("run---begin");
        System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive()=" + Thread.currentThread().isAlive());
        System.out.println("this.getName()=" + this.getName());
        System.out.println("this.isAlive()=" + this.isAlive());
        System.out.println("run---end");
    }
}

public class Test {
    
    public static void main(String[] args) {
        MyThread c = new MyThread ();
        Thread t1 = new Thread(c);
        System.out.println("main begin t1 isAlive=" + t1.isAlive());
        t1.start();
        System.out.println("main end t1 isAlive=" + t1.isAlive());
    }
}

结果:

MyThread ---begin
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
MyThread ---end
main begin t1 isAlive=false
main end t1 isAlive=true
run---begin
Thread.currentThread().getName()=Thread-1
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
run---end

说明:
① 首先搞明白该例子中一共有三条线程:
main线程:执行main方法的线程。
Thread-0线程:当前MyThread 线程实例的线程。
Thread-1线程:new Thread类创建的线程。

② MyThread 构造方法说明:

MyThread ---begin
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
MyThread ---end

执行构造器,然后当前main方法中执行初始化MyThread 类,所以当前线程的名称是main,状态是true。而当前MyThread 线程实例为Thread-0,没有启动所以状态为false。

③ Thread1线程说明:

main begin t1 isAlive=false
main end t1 isAlive=true

Thread-1线程的线程执行器没有启动,那么状态为false。执行start方法,Thread-1线程的线程执行器启动,那么状态就为true了。

④ run方法执行说明:

run---begin
Thread.currentThread().getName()=Thread-1
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
run---end

首先执行run方法的线程为Thread-1,所以当前代码块中的线程为Thread1(Thread.currentThread().getName()=Thread-1),状态自然为true。
但是this.getName()是代表当前线程Thread-0的实例,因为MyThread 线程根本没有启动,所以状态为false。

我的想法:
在我看来在Thread.currentThread.getName和this.getName的理解上上有点乱是因为是代码不够规范,像下面这种写法,既然MyThread已经继承Thread类了,那启动它的话,直接用c.start()方法不就行了。new Thread()参数需要的是一个实现Runnable接口的类,而不是继承thread的类。

        MyThread c = new MyThread ();
        Thread t1 = new Thread(c);
        t1.start();

你可能感兴趣的:(Java,学)