Thread.currentThread().getName()和this.getName()的区别
package com.zhenfen.currentThread;
import com.mchange.net.SocketUtils;
/**
* @author 007
* @ClassName 类名称
* @Description 类描述
*/
public class CountOperate extends Thread{
public CountOperate(){
System.out.println("CountOperate----begin");
//对当前所正在执行的线程对象的名字进行输出操作
//Thread.currentThread().getName()调用的是执行此行代码的线程的getName()方法
System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());
System.out.println("this.getName()="+ this.getName());
System.out.println(Thread.currentThread()==this);
System.out.println("CountOpreate-----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("run-----end");
}
}
package com.zhenfen.currentThread;
/**
* @author 007
* @ClassName 类名称
* @Description 类描述
*/
public class Run {
public static void main(String[] args) {
CountOperate c = new CountOperate();
//首先会调用CountOperate类中的构造方法
//1.输出:CountOperate----begin
//Thread.currentThread().isAlive()=true
//调用CountOperate类的构造函数是main线程,Thread.currentThread()返回的是代码段被哪一个线程调用的信息
//2.输出:Thread.currentThread().getName()= main
//this关键字指向的是当前对象的引用
//而此时还没有启动CountOperate子线程,所以打印出
//this.getName=Thread-0
//this.isAlive()=false
//此时this代表的是CountOperate对象实例,所以
//Thread.currentThread()==this false
/**
* 为什么this.getName=Thread-0呢?
* 通过查看Thread源码发现,在Thread类的构造方法中,默认会自动给name赋值:
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name.toCharArray();
*/
/**
* 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);
System.out.println("CountOpreate-----end");
}
*/
Thread t1 = new Thread(c);
/**
* 在Thread源码中实际上new Thread(c)会将c应用的对象绑定到一个private变量 * target上,
* 在t1被执行的时候即t1.run()被调用的时候,它会调用target.run()方法,也就是说它是直接调用t1对象的run方法(多态),也就是说,在run方法被执行的时候,this.getName()实际上返回的是target.getName(),
* 而Thread.currentThread().getName()实际上是t1.getName()
*/
t1.setName("A");
t1.start();
}
/**
* 运行的结果为:
* CountOperate----begin
* Thread.currentThread().getName()=main
* this.getName()=Thread-0
* CountOpreate-----end
*
* run----begin
* Thread.currentThread().getName()=A
* this.getName()=Thread-0
* run-----end
*
*
*/
}