curentThread() 方法可返回代码段正在被哪个线程调用的信息。下面通过一个示例进行说明。
假设在主线程中有如下代码:
public class Run1
{
public static void main(String[] args)
{
//调用currentThread()方法输出当前线程名称
System.out.println(Thread.currentThread().getName());
}
}
执行后在控制台会输出“main”,这说明 main() 方法被名为 main 的线程调用。
上例中 currentThread() 方法在主线程中,再来看一个在线程类中调用该方法的示例。假设 MyThread06 线程类的代码如下:
package ch14;
public class MyThread06 extends Thread
{
public MyThread06()
{
//调用currentThread()方法输出当前线程名称
System.out.println("构造方法的打印:"+Thread.currentThread().getName());
}
@Override
public void run()
{
//调用currentThread()方法输出当前线程名称
System.out.println("run方法的打印:"+Thread.currentThread().getName());
}
}
接下来编写主线程代码,创建 MyThread06 线程实例并启动线程。代码如下:
package ch14;
public class Test09
{
public static void main(String[] args)
{
MyThread06 mythread=new MyThread06();
mythread.start();
//mythread.run();
}
}
运行主线程将看到如下所示的结果。
构造方法的打印:main run方法的打印:Thread-0
从运行结果可以发现,MyThread06 类的构造函数是被 main 线程调用的,而 run() 方法是被名称为 Thread-0 的线程调用的,run() 方法是自动调用的方法。
对主线程的代码进行简单修改,使用“mythread.run()”代码来启动线程,此时的运行结果如下所示。
构造方法的打印:main run方法的打印:main
和之前的运行结果进行对比可以发现,此时 run() 方法的打印也是 main 线程调用的。
再来测试一个更复杂的情况。假设 MyThread07 线程类的代码如下:
package ch14;
public class MyThread07 extends Thread
{
public MyThread07()
{
System.out.println("构造方法---开始");
System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
System.out.println("this.getName()="+this.getName());
System.out.println("构造方法---结束");
}
@Override
public void run()
{
System.out.println("run()方法---开始");
System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
System.out.println("this.getName()="+this.getName());
System.out.println("run()方法---结束");
}
}
如上述代码所示,在 MyThread07 类的构造方法和 run() 方法中都调用了 currentThread() 方法。那么在启动该线程时构造方法的线程名称和 run() 方法中的线程名称是否相同呢?带着上面的疑问,我们来编写一个主线程对 MyThread07 类进行测试。主线程代码如下:
package ch14;
public class Test10
{
public static void main(String[] args)
{
//创建MyThread07线程实例
MyThread07 myThread=new MyThread07();
//创建一个线程
Thread t1=new Thread(myThread);
//设置线程的名称
t1.setName("A");
//启动线程
t1.start();
}
}
执行后的输出结果如下:
构造方法---开始 Thread.currentThread().getName()=main this.getName()=Thread-0 构造方法---结束 run()方法---开始 Thread.currentThread().getName()=A this.getName()=Thread-0 run()方法---结束
从结果可以发现,虽然 this.getName() 方法返回的都是 Thread-0,但是在构造方法中使用的即是 main 线程,而在 run() 方法中使用的是 A 线程。