感谢原文作者:王婷婷-Smily

原文链接:https://blog.csdn.net/dfshsdr/article/details/92760135

缘由

很多人认为多线程中的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有很大的区别。

我的理解:

Thread.currentThread()方法并不会创建线程,它只会返回当前正在执行的的线程对象。

Java Thread.currentThread()和This的区别的更多相关文章

  1. Thread.currentThread()和this的区别——《Java多线程编程核心技术》

    前言:在阅读<Java多线程编程核心技术>过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解. 具体代码如下: pub ...

  2. Thread.currentThread()与this的区别

    Thread.currentThread()与this的区别: Thread.currentThread()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引 ...

  3. Thread.currentThread与this的区别

    在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...

  4. Thread.currentThread()和this的区别

    1. Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用. 2. ...

  5. 关于 Thread.currentThread()

    currentThread()  到底是什么? 其实currentThread() 只是Thread 的一个静态方法.返回的正是执行当前代码指令的线程引用: /** * Returns a refer ...

  6. java 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

    查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup ...

  7. Java的Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区别???

    最近在看Java多线程这本书,但是发现里面有个概念自己搞不清楚.就是Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区 ...

  8. Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别

    总结起来一句话:在Thread中调用this其实就是调用Thread私有Runnable类型的target,target是Thread类的一个属性,而Thread.currentThread()是指新 ...

  9. Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术

      package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...

随机推荐

  1. capstoneCS5213|HDMI转VGA带DAV模拟音频输出转换器|CS5213方案

    capstone CS5213是一款HDMI到VGA转换器结合了HDMI输入接口和模拟RGB DAC输出且带支持片上音频数模转换器.CS5213芯片设计简单,整体芯片尺寸精悍,外围电路集成优化度较高, ...

  2. Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装

    前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...

  3. MATLAB 右键该文件不存在或者SIMULINK打开后仿真器件报错

    错误示例: 提示是否创建文件 并且会提示某某模块或者某某文件未找到not found 原因: .m文件不存在,是因为所打开的文件还并没有添加进matlab的搜索目录,或者是需要.m文件运行后生成的 某 ...

  4. js 中&&的使用

    遇到下列代码goHome && (await router.replace(PageEnum.BASE_HOME)); &&这个逻辑与的作用是,当goHome为true ...

  5. 初识python:格式化输出

    使用input函数输入用户值,再使用三种方法格式化输出. #!/user/bin env python # author:Simple-Sir # 20180831 # 格式化输出: name = i ...

  6. unittest_认识unittest(1)

    unittest是python内置的单元测试框架,具备编写用例.组织用例.执行用例.输出报告等自动化框架的条件. 使用unittest前需要了解该框架的五个概念: 即test case,test su ...

  7. Vue-cli代理解决跨域问题

    使用vue-cli调接口的时候,总是会出现垮与问题,因为vue的localhost与访问域名不一致导致.而这一点,开发者显然也想到了,故而在vuejs-templates,也就是vue-cli的使用的 ...

  8. 网络协议学习笔记(九)CDN和数据中心

    概述 上一篇给大家介绍了DNS协议和HttpDns协议,现在给大家介绍一下CDN和数据中心相关的知识. CDN:你去小卖部取过快递么? 如果你去电商网站下单买个东西,这个东西一定要从电商总部的中心仓库 ...

  9. Linux防火墙--IPtables企业级配置策略思路

    一.防火墙简介 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内.外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术. 防火墙发展应用:最早 ...

  10. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...