首页 > 其他分享 >深入浅出Thread.currentThread()与this的区别

深入浅出Thread.currentThread()与this的区别

时间:2023-12-12 18:14:11浏览次数:31  
标签:currentThread Thread point getName 深入浅出 System println

Thread.currentThread() 与 this 的意义

  1. Thread.currentThread() 可以获取当前线程的引用
  2. this 可以理解为调用当前方法的对象的引用

初步分析

代码如下,生成一个线程,并且启动线程。

public class Main {
    public static void main(String[] args) {
        Point point = new Point();
        point.start();
    }
}

class Point extends Thread {

    @Override
    public void run() {
        System.out.println("------分割线---------");
        Thread thread = Thread.currentThread();
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("this.getName() = " + this.getName());
        System.out.println("Thread.currentThread() == this : " + (Thread.currentThread() == this));
    }
}

image.png
运行结果如图所示,此时我们可以看到,此时this 与 Thread.currentThread()是同一个引用

因为此时Run方法是直接调用的是重写的Run方法,也就是说调用者就是point这个对象本身,所以this = Thread.currentThread。什么时候不直接调用重写的Run方法呢?
可能到这你有点迷惑,但是别着急,接着往下看。

深入分析

我们再看下面这段代码

package org.example;

public class Main {
    public static void main(String[] args) {
        Point point = new Point();
        point.setName("point");
        Thread thread = new Thread(point);
        thread.setName("test");
        thread.start();
    }
}

class Point extends Thread {

    @Override
    public void run() {
        System.out.println("------分割线---------");
        Thread thread = Thread.currentThread();
        System.out.println("Thread.currentThread().getName() =" + Thread.currentThread().getName());
        System.out.println("this.getName() = " + this.getName());
        System.out.println("Thread.currentThread() == this " + (Thread.currentThread() == this));
    }
}

运行结果如下
image.png
我们会发现this 与 Thread.currentThread()不是同一个引用。
image.png
image.png
我们通过对构造方法打断点可以看到,point 被赋值给了 Thread 内的 target 。
那我们在看下Thread内的 Run方法
image.png
我们可以看到最终是由Target对象调用自己的run方法。
所以一切都合理了。

this.getName() 得到的是 调用者也就是Target的name,输出point
currentThread.getName() 得到的是当前线程对象的name,所以输出test(PS:Thread有一个字段存储存储Name)
image.png
image.png

标签:currentThread,Thread,point,getName,深入浅出,System,println
From: https://www.cnblogs.com/x1uc/p/17897500.html

相关文章

  • Performance Improvements in .NET 8 & 7 & 6 -- Thread【翻译】
    线程.NET的最近版本在线程、并行、并发和异步等方面做出了巨大的改进,例如ThreadPool的完全重写(在.NET6和.NET7中),异步方法基础设施的完全重写(在.NETCore2.1中),ConcurrentQueue的完全重写(在.NETCore2.0中)等等。这个版本没有包含这样的大规模改革,但它确实包含了一......
  • Netty源码学习8——从ThreadLocal到FastThreadLocal(如何让FastThreadLocal内存泄漏do
    系列文章目录和关于我一丶引入在前面的netty源码学习中经常看到FastThreadLocal的身影,这一篇我们将从ThreadLocal说起,来学习FastThreadLocal的设计(《ThreadLocal源码学习笔记》)二丶从ThreadLocal说起ThreadLocal是JDK中实现线程隔离的一个工具类。实现线程隔离maybe你第一反应......
  • [JVM] 应用诊断工具之Fastthread(在线诊断)
    0序言背景近期生产系统遇到了一个线程方面的问题,目前根因已定位到。现将fastthread这一诊断工具做一小结,便于以后快速使用博主我遇到的线程问题:java.lang.OutOfMemoryError:unabletocreatenewnativethreadjava.lang.OutOfMemoryError有8种类型。这8种类型中j......
  • Thread常见方法:interrupt 方法详解
    打断sleep,wait,join的线程这几个方法都会让线程进入阻塞状态打断sleep的线程,会清空打断状态,以sleep为例privatestaticvoidtest1()throwsInterruptedException{Threadt1=newThread(()->{sleep(1);},"t1");t1.start();sleep(0.5);t1.interrupt();l......
  • Thread常见方法:join 方法详解
    为什么需要join下面的代码执行,打印r是什么?staticintr=0;publicstaticvoidmain(String[]args)throwsInterruptedException{test1();}privatestaticvoidtest1()throwsInterruptedException{log.debug("开始");Threadt1=newThread(()->{log.de......
  • Thread常见方法:sleep 与 yield
    sleep1.调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)2.其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException3.睡眠结束后的线程未必会立刻得到执行4.建议用TimeUnit的sleep代替Thread的sleep来获得更......
  • Thread介绍与原理分析
    TheadLocal介绍及用法ThreadLocal是线程的本地变量。当使用ThreadLocal维护变量时,它为每个线程提供独立的变量副本。每一个线程可以独立地操作自己的变量,不受其他线程影响。使用场景作为数据副本,当某些数据是以线程为作用域并且不同线程有不同数据副本,使用ThreadLocal。保存......
  • C2 CompilerThread9 长时间占用CPU解决方案
    一、问题描述近期在进行日常巡检时发现,线上部分应用服务器的CPU突然比以往高出很多,经过登录机器排查确认是C2CompilerThread9线程始终长时间运行消耗了CPU。排查步骤在上篇博文有记录总结,地址:排查CPU异常步骤_u012538947的专栏-CSDN博客_cpu异常异常线程的堆栈如下:"C2Compile......
  • RT Thread中配置AD7190
    ​详见RTThread中配置AD7190-CSDN博客 ​编辑使用前先复位操作1SCL空闲时会高电平。2复位:上电后连续输入40个1(时钟周期)复位到已知状态,并等待500us后才能访问串行接口,用于SCLK噪音导致的同步。​编辑voidAD7190_Reset(void){spi_dev_ad7190=(structrt_spi_devi......
  • 应用报错:java.lang.OutOfMemoryError: unable to create new native thread
    上个月生产环境忽然出现部分交易处理缓慢甚至超时,查看对应应用日志发现一直在刷报错日志,报错信息如下java.lang.OutOfMemoryError:unabletocreatenewnativethread从报错上来看是说不能创建本地线程了,应用都是容器部署的,开始我怀疑是容器内存不够了导致内存泄露,但经过查看容器......