currentThread()方法
currentThread()方法返回正在被执行的线程的信息。
public class Run1{
public static void main(String[] args){
System.out.println(Thread.currentThread().getName());
}
}
注意事项:main线程是主线程,和main方法没有关系,只是同名而已。
接下来我们看看构造方法和run方法是被哪个线程调用的?
public class MyThread extends Thread{
public MyThread() {
System.out.println("构造方法的打印:"+ Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("run方法的打印:"+Thread.currentThread().getName());
}
}
public class Run2 {
public static void main(String[] args) {
MyThread mt = new MyThread();
// mt.start();
mt.run();
}
}
从左上图可以看到,构造方法和直接调用run方法都是main线程在执行。而右上图调用的是start方法,这时构造方法还是main线程调用,而run方法是由Thread-0线程调用。
由于此处没有给自定义的线程设置名字,所以JVM默认给它一个名字Thread-0。
接下来再来看看currentThread()方法和this的区别:
public class CountOperate extends Thread {
public CountOperate(){
System.out.println("CountOperate --- begin");
System.out.println("Thread.currentThread().getName() = "+Thread.currentThread().getName());
System.out.println("this.getName()"+this.getName());//这个this指的是当前线程类
System.out.println("CountOperate --- 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 ");
}
}
public class CountOperateTest {
public static void main(String[] args) {
CountOperate countOperate = new CountOperate();//main线程调用构造方法
//将自定义线程类的run方法给thread对象调用
Thread thread = new Thread(countOperate);
//给thread对象设置name
thread.setName("AAA");
//启动thread对象
thread.start();
}
}
在测试类中,我们把自定义线程类对象以参数的形式传递给Thread类的构造器,就是把自定义线程类的run方法交给thread对象调用,然后给这个thread类对象设置名字为AAA。构造方法是由main线程执行,this对象代表的是自定义线程对象,而这个线程没有启动,它的run方法交给了AAA这个线程调用,JVM给this这个线程对象一个默认的名字叫Thread-0。
currentThread()方法返回的是当前正在被执行的线程,而this是自定义线程对象。