15.3.2 得到当前的线程
既然线程是代码的执行器,那么每行代码在真正执行的时候,都是由某个线程负责的。如何得到这个线程呢?下面的内容给出了答案。
1.Thread类的静态方法currentThread()
我们知道,Java的线程是执行Java程序的基本单位。也就是说,所有的Java代码最终都是由线程执行的,就好像所有的音符都是由演奏家演奏 的。如果在程序中需要得到"执行当前代码的线程的引用",那么就可以使用Thread类的静态方法Thread currentThread()。这个方法的返回值是Thread的引用,这个引用所指向的Thread类的实例正是"指向执行当前代码的线程"。下面通 过一个简单的程序来演示一下如何使用这个方法。
2.使用Thread.currentThread()方法
下面将给出一个程序,展示Thread.currentThread()的用法。
- package com.javaeasy.currentthread; // 包名
- public class PrintCurrentThreadName { //
类名,此类不是Thread类的子类- public void printCurrentThreadName() { //
打印当前线程名字的方法- Thread currentThread = Thread.
currentThread(); // 获得当前的线程- String threadName = currentThread .getName();
- //
得到当前线程的名字- System.out.println("执行代码的线程名叫做:" + threadName);
- //
向控制台输出当前线程的名字- }
- }
在上面的程序中,首先使用Thread.currentThread()方法得到执行当前代码的线程引用,并将它赋值给currentThread,然后使用currentThread执行getName()方法来得到当前线程的名字,最后将这个名字输出到控制台。
3.在主线程中使用PrintCurrentThreadName
下面的例程使用了PrintCurrentThreadName类。
- package com.javaeasy.currentthread; // 程序包
- public class CurrentThreadMain { // 例程类
- public static void main(String[] args) { // main()方法
- // 创建一个CurrentThreadNamePrinter类的实例
- CurrentThreadNamePrinter printer =
new CurrentThreadNamePrinter();- // 调用printCurrentThreadName()方法,
用来输出执行此方法的线程的名字- printer.printCurrentThreadName();
- }
- }
在上面的例程中,首先创建了一个CurrentThreadNamePrinter类的实例, 然后通过这个实例调用了printCurrentThreadName()方法。在printCurrentThreadName()方法中,会使用 Thread.currentThread()得到"执行当前代码的线程的引用",并通过这个引用来得到线程的名字,将它输出到控制台。运行例程,控制台 输出如下内容:
执行代码的线程名叫做:main
在上面的例程中,没有创建新的线程,执行printCurrentThreadName()方法的线程肯定就是主线程。我们前面说过,主线程的名字一般会被设置为main。通过控制台的输出,也可以证明这一点。
4.在新的线程中使用TestMultiply
下面的例程将创建一个新的线程,并在这个线程中执行printCurrentThreadName()方法。
- package com.javaeasy.currentthread; // 包名
- public class CurrentThreadMainII { // 例程名
- public static void main(String[] args) { // main()方法
- Runnable runnable = new Runnable() {
- // 通过匿名内部
类创建一个Runnable的实例- public void run() { // 实现抽象方法run()
- // 创建一个CurrentThreadNamePrinter类的实例
- CurrentThreadNamePrinter printer =
new CurrentThreadName-- Printer();
- // 调用printCurrentThreadName()方法,
用来输出执行此方法的线程的- // 名字
- printer.printCurrentThreadName();
- }
- };
- // 使用runnable创建一个线程,线程名字叫做"线程-1"
- Thread thread = new Thread(runnable, "线程-1" );
- thread.start(); // 启动线程
- }
- }
在上面的例程中,首先创建了一个实现Runnable接口的匿名内部类的实例(关于匿名内部类的内容,请参见13.5节)。然后使用这个实例,创建了一个Thread类的实例,它的名字是"线程-1",最后启动这个线程。运行例程,控制台输出如下内容:
- 执行代码的线程名叫做:线程-1
同样,printCurrentThreadName()方法获得了执行当前代码的线程名字。
5.理解Thread.currentThread()方法
我们可以假设乐谱中有一个特殊的符号@,每当演奏家演奏这个"音符"的时候,就会报出自己的"编号"(注意,不是名字)。编号对每个演奏家都是不同的。通过这个编号就可以找到这个演奏家,那么这个编号其实就相当于Java中的引用的值。
对于一段程序,任何一个线程都可以去执行它。在程序中,就可以通过 Thread.currentThread()来得到执行程序的线程;同样,对于一段乐谱,任何一个演奏家也都可以演奏,而通过乐谱中的@符合就可以得到 演奏家的编号。得到这个编号以后就可以在乐谱中来"指挥"演奏家(当然现实中的乐谱并没有这个功能)。图15-8说明了这个对应关系。
![]() |
图15-8 得到当前线程的引用和得到当前演奏家的编号 |
图15-9中,假设"演奏会"模型中的乐谱中有特殊的符号,可以通过演奏家的编号来指挥演奏家。而符号@就是得到演奏当前乐谱的演奏家。好,本节已经介绍了足够多的关于线程的内容,下面开始新的一节,让我们看看"多个线程的故事"。
理解Thread.currentThread()方法的作用:对于任何一段程序,肯定都是由一个线程来执行的,而Thread.currentThread()方法的返回值则正是"指向执行当前程序的线程的引用"。