《Java多线程编程核心技术(第2版)》 —1.3 currentThread()方法
1.3 currentThread()方法
currentThread()方法可返回代码段正在被哪个线程调用。下面通过一个示例进行说明。
创建t6项目,创建Run1.java类代码如下:
public class Run1 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
}
}
程序运行结果如图1-28所示。
图1-28 Run1.java运行结果
该运行结果说明main()方法是被名为main的线程调用的。
继续实验,创建MyThread.java类,代码如下:
public class MyThread extends Thread {
public MyThread() {
System.out.println("构造方法的打印:" + Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("run方法的打印:" + Thread.currentThread().getName());
}
}
运行类Run2.java代码如下:
public class Run2 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.start();
// mythread.run();
}
}
程序运行结果如图1-29所示。
图1-29 Run2.java运行结果
从图1-29的运行结果可以发现,MyThread.java类的构造函数是被main线程调用的,而run()方法是被名称为Thread-0的线程调用的,run()方法是自动调用的方法。
文件Run2.java代码更改如下:
public class Run2 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
// mythread.start();
mythread.run();
}
}
程序运行结果如图1-30所示。
图1-30 结果显示均被main主线程所调用
执行方法run()和start()还是有一些区别的。
1)my.run();:立即执行run()方法,不启动新的线程。
2)my.start();:执行run()方法时机不确定,启动新的线程。
再来测试一个比较复杂的情况,创建测试用的项目currentThreadExt,创建Java文件CountOperate.java,代码如下:
package mythread;
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());
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");
}
}
创建Run.java文件,代码如下:
package test;
import mythread.CountOperate;
public class Run {
public static void main(String[] args) {
CountOperate c = new CountOperate();
Thread t1 = new Thread(c);
t1.setName("A");
t1.start();
}
}
程序运行结果如下:
CountOperate---begin
Thread.currentThread().getName()=main
this.getName()=Thread-0
CountOperate---end
run---begin
Thread.currentThread().getName()=A
this.getName()=Thread-0
run---end
代码this.getName()代表MyThread对象的name名称,由于MyThread对象的name名称从未改变,所以默认为Thread-0。
- 点赞
- 收藏
- 关注作者
评论(0)