【多线程】Thread.currentThread()和This的区别

博客主要探讨多线程中Thread.currentThread()和this的不同含义。通过实例展示运行结果,分析源码发现,Thread.currentThread返回当前执行的线程,而this代表当前对象。结论指出,Thread.currentThread表示代码段被调用的线程信息,this表示当前对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

缘由

  很多人认为多线程中的Thread.currentThread()和this都是显示当前线程的意思,其实不然,他们两个代表不同的意思,下面用一个小例子说明一下。

package currentThreadAndThis;
public class MyThread extends Thread {
    public MyThread(){
        System.out.println("当前线程的名字:"+Thread.currentThread().getName());
        System.out.println("当前线程的名字:"+this.getName());
    }
    @Override
    public void run(){
        System.out.println("当前线程的名字:"+Thread.currentThread().getName()+"   run=="+Thread.currentThread().isAlive());
        System.out.println("当前线程的名字:"+this.getName()+"  run=="+this.isAlive());
    }
}

//启动类
package currentThreadAndThis;
public class Run {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        //初始化Thread对象,方便调用start();
        //此时myThread作为参数传入Thread中,其实是myThread委托thread去执行;
        Thread thread=new Thread(myThread);
        //初始化自定义线程名称
        thread.setName("C");
        //启动线程
        thread.start();

    }
}

运行结果
1.当前线程的名字:main
2.当前线程的名字:Thread-0
3.当前线程的名字:C run == true
4.当前线程的名字:Thread-0 run ==false

 然后我们会看到执行构造函数 MyThread myThread=new MyThread();,然后打印的结果是“当前线程的名字:main ;当前线程的名字:Thread-0”.
为什么会是这样呢?来分析一下源码:

分析

(一)首先看一下首先看Thread.currentThread方法源码:
在这里插入图片描述
 它返回的是当前执行的线程;然后我们首先启动的是main线程,所以我们打印出------- “当前线程的名字:main

(二)来看一下,this的调用,首先分析一下Thread的构造函数:
在这里插入图片描述
 线程在初始化对象的时候, this代表的当前对象MyThread,然后Thread在初始化对象的时候,会给线程起一个默认的初始名,所以this.getname()打印出来是“当前线程的名字:Thread-0”。
 (1) 在执行“ thread.start();”时,因为**myThread作为参数传入Thread中,其实是myThread委托thread去执行;**所以在执行–“ thread.setName(“C”);”,通过“**Thread.currentThread().getName()”**打印出来时“当前线程的名字:C”

 (2) 但是此时执行this.getname()仍然代表的是Mythread这个对象,所以打印出来的仍然是“当前线程的名字:Thread-0

结论

①Thread.currentThread表示当前代码段正在被哪个线程调用的相关信息。

②this表示的是当前对象,与Thread.currentThread有很大的区别。

### Java 多线程中 `mThread` `Thread.currentThread()` 的区别及用法 #### 定义与作用范围 - **`mThread`** 是自定义线程对象的实例名称。通常情况下,这是通过继承 `Thread` 类或者实现 `Runnable` 接口并创建相应类的对象得到的实体。此变量代表特定的任务或操作序列,在程序运行期间可以启动、暂停甚至终止该线程。 - **`Thread.currentThread()` 方法返回的是正在执行代码的那个线程对象。无论是在哪个地方调用了这个静态方法,它总是能够获取到当前上下文中实际工作的那个线程实例[^1]。 #### 使用场景对比 对于 `mThread`: - 当需要显式控制某个具体线程的行为时会使用此类型的引用; - 可以用来传递给其他函数作为参数,以便于外部组件能访问管理这条独立的工作流; 而对于 `Thread.currentThread()` 则适用于如下情况: - 需要知道是谁触发了某段逻辑的时候非常有用; - 如果想在线程内部做一些自我管理状态查询工作,则可以直接利用这种方法获得自身的句柄而无需额外保存对自己本身的引用; ```java @Override public void run() { // 获取当前线程的信息 String currentThreadName = Thread.currentThread().getName(); System.out.println("Current thread name: " + currentThreadName); } ``` #### 实际应用案例分析 考虑一个多线程应用程序中有三个不同功能的子任务分别由不同的线程负责处理的情况: ```java MyThread mThread1 = new MyThread("线程一"); MyThread mThread2 = new MyThread("线程二"); MyThread mThread3 = new MyThread("线程三"); mThread1.start(); mThread2.start(); mThread3.start(); ``` 这里每一个 `mThreadX` 对象都对应着一个具体的后台进程,并且可以通过这些名字来区分它们各自的角色职责。然而如果想要知道哪一个确切地在某一时刻正处在活动状态的话,就需要借助 `Thread.currentThread()` 来动态取得信息而不是依赖预先设定好的标签[^2]。 #### 中断机制中的角色差异 当涉及到更复杂的并发编程概念比如中断时,两者之间的关系也变得尤为重要。例如下面这段演示如何优雅地中止一个无限循环的例子就很好地体现了这一点: ```java public class MyThread extends Thread { @Override public void run() { int i = 0; while (!isInterrupted()) { try { System.out.println(Thread.currentThread().getName() + ": " + i++); sleep(1000); // Simulate work being done. } catch (InterruptedException e) { break; // Exit loop on interrupt exception. } } } public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread(); thread.start(); // Wait a bit before attempting to interrupt the thread... sleep(5 * 1000); thread.interrupt(); // Signal that we want this thread to stop its task. thread.join(); // Wait until our worker has finished up or been interrupted properly. System.out.println("Main program continues after all threads have completed."); } } ``` 在这个例子中可以看到,虽然我们是基于名为 `thread` 的 `mThread` 实例来进行启动(`start`)以及发送停止信号的操作 (`interrupt`) ,但是在 `run` 函数体内却采用了 `Thread.currentThread()` 去检测是否应该结束本次迭代过程。这是因为只有后者才能准确反映出此刻真正活跃的那个个体的身份特征[^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值