《Java多线程编程核心技术(第2版)》 —1.3 currentThread()方法

举报
华章计算机 发表于 2020/02/08 13:55:33 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.3节,作者是高洪岩。

1.3 currentThread()方法

currentThread()方法可返回代码段正在被哪个线程调用。下面通过一个示例进行说明。

创建t6项目,创建Run1.java类代码如下:

public class Run1 {

    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getName());

    }

}

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

 image.png

图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所示。

 image.png

图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所示。

 image.png

图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。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。