得到当前的线程

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 13:34   11   0

15.3.2 得到当前的线程

既然线程是代码的执行器,那么每行代码在真正执行的时候,都是由某个线程负责的。如何得到这个线程呢?下面的内容给出了答案。

1.Thread类的静态方法currentThread()

我们知道,Java的线程是执行Java程序的基本单位。也就是说,所有的Java代码最终都是由线程执行的,就好像所有的音符都是由演奏家演奏 的。如果在程序中需要得到"执行当前代码的线程的引用",那么就可以使用Thread类的静态方法Thread currentThread()。这个方法的返回值是Thread的引用,这个引用所指向的Thread类的实例正是"指向执行当前代码的线程"。下面通 过一个简单的程序来演示一下如何使用这个方法。

2.使用Thread.currentThread()方法

下面将给出一个程序,展示Thread.currentThread()的用法。

 
  1. package com.javaeasy.currentthread; // 包名
  2. public class PrintCurrentThreadName { //
    类名,此类不是Thread类的子类
  3. public void printCurrentThreadName() { //
    打印当前线程名字的方法
  4. Thread currentThread = Thread.
    currentThread(); // 获得当前的线程
  5. String threadName = currentThread .getName();
  6. //
    得到当前线程的名字
  7. System.out.println("执行代码的线程名叫做:" + threadName);
  8. //
    向控制台输出当前线程的名字
  9. }
  10. }

在上面的程序中,首先使用Thread.currentThread()方法得到执行当前代码的线程引用,并将它赋值给currentThread,然后使用currentThread执行getName()方法来得到当前线程的名字,最后将这个名字输出到控制台。

3.在主线程中使用PrintCurrentThreadName

下面的例程使用了PrintCurrentThreadName类。

 
  1. package com.javaeasy.currentthread; // 程序包
  2. public class CurrentThreadMain { // 例程类
  3. public static void main(String[] args) { // main()方法
  4. // 创建一个CurrentThreadNamePrinter类的实例
  5. CurrentThreadNamePrinter printer =
    new CurrentThreadNamePrinter();
  6. // 调用printCurrentThreadName()方法,
    用来输出执行此方法的线程的名字
  7. printer.printCurrentThreadName();
  8. }
  9. }

在上面的例程中,首先创建了一个CurrentThreadNamePrinter类的实例, 然后通过这个实例调用了printCurrentThreadName()方法。在printCurrentThreadName()方法中,会使用 Thread.currentThread()得到"执行当前代码的线程的引用",并通过这个引用来得到线程的名字,将它输出到控制台。运行例程,控制台 输出如下内容:

执行代码的线程名叫做:main

在上面的例程中,没有创建新的线程,执行printCurrentThreadName()方法的线程肯定就是主线程。我们前面说过,主线程的名字一般会被设置为main。通过控制台的输出,也可以证明这一点。

4.在新的线程中使用TestMultiply

下面的例程将创建一个新的线程,并在这个线程中执行printCurrentThreadName()方法。

 
  1. package com.javaeasy.currentthread; // 包名
  2. public class CurrentThreadMainII { // 例程名
  3. public static void main(String[] args) { // main()方法
  4. Runnable runnable = new Runnable() {
  5. // 通过匿名内部
    类创建一个Runnable的实例
  6. public void run() { // 实现抽象方法run()
  7. // 创建一个CurrentThreadNamePrinter类的实例
  8. CurrentThreadNamePrinter printer =
    new CurrentThreadName-
  9. Printer();
  10. // 调用printCurrentThreadName()方法,
    用来输出执行此方法的线程的
  11. // 名字
  12. printer.printCurrentThreadName();
  13. }
  14. };
  15. // 使用runnable创建一个线程,线程名字叫做"线程-1"
  16. Thread thread = new Thread(runnable, "线程-1" );
  17. thread.start(); // 启动线程
  18. }
  19. }

在上面的例程中,首先创建了一个实现Runnable接口的匿名内部类的实例(关于匿名内部类的内容,请参见13.5节)。然后使用这个实例,创建了一个Thread类的实例,它的名字是"线程-1",最后启动这个线程。运行例程,控制台输出如下内容:

 
  1. 执行代码的线程名叫做:线程-1

同样,printCurrentThreadName()方法获得了执行当前代码的线程名字。

5.理解Thread.currentThread()方法

我们可以假设乐谱中有一个特殊的符号@,每当演奏家演奏这个"音符"的时候,就会报出自己的"编号"(注意,不是名字)。编号对每个演奏家都是不同的。通过这个编号就可以找到这个演奏家,那么这个编号其实就相当于Java中的引用的值。

对于一段程序,任何一个线程都可以去执行它。在程序中,就可以通过 Thread.currentThread()来得到执行程序的线程;同样,对于一段乐谱,任何一个演奏家也都可以演奏,而通过乐谱中的@符合就可以得到 演奏家的编号。得到这个编号以后就可以在乐谱中来"指挥"演奏家(当然现实中的乐谱并没有这个功能)。图15-8说明了这个对应关系。

图15-8 得到当前线程的引用和得到当前演奏家的编号

图15-9中,假设"演奏会"模型中的乐谱中有特殊的符号,可以通过演奏家的编号来指挥演奏家。而符号@就是得到演奏当前乐谱的演奏家。好,本节已经介绍了足够多的关于线程的内容,下面开始新的一节,让我们看看"多个线程的故事"。

理解Thread.currentThread()方法的作用:对于任何一段程序,肯定都是由一个线程来执行的,而Thread.currentThread()方法的返回值则正是"指向执行当前程序的线程的引用"。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP