得到当前的线程

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

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

3.在主线程中使用PrintCurrentThreadName

下面的例程使用了PrintCurrentThreadName类。

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

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

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

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

4.在新的线程中使用TestMultiply

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

 
 
  1. package  com.javaeasy.currentthread;          // 包名  
  2.  
  3. public   class  CurrentThreadMainII {               // 例程名  
  4.      public   static   void  main(String[] args) {     // main()方法  
  5.         Runnable runnable =  new  Runnable() {  
  6.                                      // 通过匿名内部
    类创建一个Runnable的实例
     
  7.              public   void  run() {      // 实现抽象方法run()  
  8.                  // 创建一个CurrentThreadNamePrinter类的实例  
  9.                 CurrentThreadNamePrinter printer = 
    new  CurrentThreadName-  
  10.                 Printer();  
  11.                  // 调用printCurrentThreadName()方法,
    用来输出执行此方法的线程的
     
  12.                  // 名字  
  13.                 printer.printCurrentThreadName();  
  14.             }  
  15.         };  
  16.          // 使用runnable创建一个线程,线程名字叫做"线程-1"  
  17.         Thread thread =  new  Thread(runnable,  "线程-1" );     
  18.         thread.start();                          // 启动线程  
  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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值