Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

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 Run2.java的运行结果

程序运行结果如图1-29所示。

从图1-29中的运行结果可以发现,MyThread.java类的构造方法是被main线程调用的,而run方法是被名为Thread-0的线程调用的,run方法是被JVM自动调用的方法。

文件Run2.java代码更改如下:


public class Run2 {
public static void main(String[] args) {
    MyThread mythread = new MyThread();
    // mythread.start();
    mythread.run();
}
}

图1-30 均被main主线程所调用

运行结果如图1-30所示。

执行run()和start()方法还是有一些区别的,如下:

1)my.run();:立即执行run()方法,不启动新的线程。

2)my.start();:执行run()方法时机不确定时,启动新的线程。

在前面的实验中,构造方法都是由main线程调用的,但不要认为所有的构造方法都必须由main线程调用,要结合实际情况与写法确定,其他线程也可以调用构造方法,比如main方法启动A线程,又在A线程中的run()方法里启动B线程,此时在B线程的构造方法中输出Thread.currentThread().getName()方法的返回值就不是main,请自行进行测试。

再来测试一个比较复杂的情况,创建测试用的项目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()代表CountOperate对象的name名称,由于CountOperate对象的name名称从未设置,所以默认为Thread-0。