this的意思是代表当前对象的。而this在线程的环境下,代表的是当前线程实例对象本身。所以this.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=trueThread-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();