Java Thread.currentThread()和This的区别
感谢原文作者:王婷婷-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的区别的更多相关文章
- Thread.currentThread()和this的区别——《Java多线程编程核心技术》
前言:在阅读<Java多线程编程核心技术>过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解. 具体代码如下: pub ...
- Thread.currentThread()与this的区别
Thread.currentThread()与this的区别: Thread.currentThread()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引 ...
- Thread.currentThread与this的区别
在看多线程的时候,看到这个知识点,感觉需要验证一下. 一:线程自启动 1.程序 package com.jun.it.thread; public class MyThread extends Thr ...
- Thread.currentThread()和this的区别
1. Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用. 2. ...
- 关于 Thread.currentThread()
currentThread() 到底是什么? 其实currentThread() 只是Thread 的一个静态方法.返回的正是执行当前代码指令的线程引用: /** * Returns a refer ...
- java 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup ...
- Java的Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区别???
最近在看Java多线程这本书,但是发现里面有个概念自己搞不清楚.就是Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区 ...
- Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别
总结起来一句话:在Thread中调用this其实就是调用Thread私有Runnable类型的target,target是Thread类的一个属性,而Thread.currentThread()是指新 ...
- Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术
package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...
随机推荐
- JDK HttpClient 多重请求-响应的处理
HttpClient 多重请求-响应的处理 目录 HttpClient 多重请求-响应的处理 1. 简述 2. 请求响应流程图 3. 用户请求的复制 4. 多重请求处理概览 5. 请求.响应过滤的执行 ...
- 【MySQL作业】多字段分组和 having 子句——美和易思分组查询应用习题
点击打开所使用到的数据库>>> 1.按照商品类型和销售地区分组统计商品数量和平均单价,并按平均单价升序显示. -- 按照商品类型和销售地区分组统计商品数量和平均单价,并按平均单价升序 ...
- CGO快速入门
1. 通过`improt "C"`语句开启CGO特性2. `/**/`中间是C代码,之后接 import "C" 如果存在空行 就会报错.could not d ...
- react中实现css动画
- Python常用功能函数系列总结(七)
本节目录 常用函数一:批量文件重命名 常用函数一:批量文件重命名 # -*- coding: utf-8 -*- """ DateTime : 2021/02/08 10 ...
- FastDFS的应用
一.定义 FastDFS是由淘宝的余庆先生所开发的一个轻量级.高性能的开源分布式文件系统.用纯C语言开发,功能丰富: 文件存储 文件同步 文件访问(上传.下载) 存取负载均衡 在线扩容 适合有大容量存 ...
- hyperf 如何对AMQP消息进行手动消费?
转发自白狼栈:查看原文 在使用 hyperf 官方自带的 AMQP 队列时你会发现,不需要我们再额外启动进程对消息进行消费.这是因为默认情况下,使用 @Consumer 注解时,hyperf 会为我们 ...
- sqlmap之--os-shell命令执行原理
最近也是在看sqlmap,感觉--os-shell这个命令确实很厉害,但我并不知道它的原理,所以来研究一下 环境 环境就是我本地搭的一个有sql注入漏洞的一个小demo 演示 这是我们的demo环境 ...
- Hello world.java
Hello world 1.随便新建一个文件夹,存放源代码 2.新建一个Java文件 文件后缀名为.java Hello.java [注意点]系统可能显示没有后缀名,我们需要手动打开 3.编写代码 p ...
- 介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)
1.打开开发者工具:右键-->检查 (快捷键 f12) 2.开发者工具介绍: (1): 选择页面的dom进行查看 (2):设备适配 (3)元素: ① 可以查找到界面对应的dom: ② 通过计算样 ...