Java线程中currentThread().xxx和this.xxx的区别

学习Java多线程时经常会用到currenThread()方法,此方法是定义在Thread类中的方法,用来返回一个Thread类型对象,该对象为当前时刻正在执行的线程。而我们经常会用到currentTread().getName()这样的方法来获取当前正在执行的线程的名字。

有些人可能会问,为什么不能在线程的run()方法内使用this.getName()直接获取该线程的线程名并且输出呢?这样在执行这个线程的run方法的时候不也能输出此运行线程的线程名吗?一般情况下是可以这样的,但是如果遇到以下情况,就不是这样了:

public class MyThread extends Thread{
	public MyThread() {
		System.out.println("===线程初始化===");
		System.out.println("currentThread().getName()="+Thread.currentThread().getName());
		System.out.println("this.getName()="+this.getName());
		System.out.println("currentThread().isAlive()"+currentThread().isAlive());
	}
	@Override
	public void run() {
		System.out.println("===run()方法执行===");
		System.out.println("currentThread().getName()="+Thread.currentThread().getName());
		System.out.println("this.getName()="+this.getName());
		System.out.println("this.isAlive()"+this.isAlive());
	}
}

上述代码定义了一个MyThread类,他继承自Thread类并且在构造函数中,输出当前执行线程的名字、this.getName()即当前类的名字和当前执行线程的isAlive状态。同时在run()方法中输出当前执行线程的名字、当前类的名字与isAlive状态。接着在主函数中进行如下操作:

public class Test{
	public static void main(String args[]) {
		MyThread mt = new MyThread();
		Thread th = new Thread(mt);
		th.setName("Mango");
		th.start();
		System.out.println("外部调用:th.isAlive()"+th.isAlive());
	}
}

运行后结果为:

===线程初始化===

currentThread().getName()=main

this.getName()=Thread-0

currentThread().isAlive()true

外部调用:th.isAlive()true

===run()方法执行===

currentThread().getName()=Mango

this.getName()=Thread-0

this.isAlive()false


可以看到,在主函数中,我们使用MyThread类的实例化对象mt来初始化一个新的Thread,也就是说在Thread对象th实例化的时候,将mt放进构造函数中,然后调用th.setName()对th的线程名进行命名。观察输出结果可以发现:


1、线程mt初始化的时候,输出MyThread构造函数中的内容,此时调用方法的线程是main主线程;

2、this.getName()返回的是刚刚创建的线程mt,名字为Thread-0;

3、currentThread().isAlive指的是main线程的状态,返回true;

4、run()方法中的currentThread().getName()返回的是此时正在执行的线程名,应为上面已经将th名字改为Mango,所以输出Mango;

5、重点在这里,为什么输出this.getName()的时候会输出Thread-0呢,不是应该输出Mango吗?


这里我们要返回程序中重新思考一个问题,我们要知道mt和th是完全不同的两个线程对象,他们之间产生的唯一关系就是我们在创建th的时候,将mt丢进了构造函数中,目的是为了让th在执行的时候,调用的是mt的run()方法。这样再回头看程序的输出,th中的run()方法执行的时候,实际上执行的是mt的run()方法,这样在他调用this.getName()的时候,这个this自然指的就是mt线程,理所应当输出的也就是Thread-0了。


同理,在线程的run()方法外部使用th.xxx和在run()内部使用this.xxx返回的是不同的结果,也可以证明,这个this指的并不是th线程本身。


猜你喜欢

转载自blog.csdn.net/u012198209/article/details/80079122