Thread.currentThread().getName() 和 this.getName()区别详解

Thread.currentThread().getName() 和 this.getName()区别详解



<<Java多线程编程核心技术>>

这本书里说到了这个:  Thread.currentThread().getName()

this.getName()

他俩是有区别的,得到的效应是不一样的,首先,从直观上来说:

Thread.currentThread().getName() 是一个静态方法

this.getName()是一个实例方法

实例方法,一般情况下是:反映这个实例的情况

静态方法,一般情况下是:反映这个实体的情况

实例指的就是这个类的对象

实体却不一样,实体是指正在发生这个作用的实例

上代码:

  1. public class MyThread extends Thread {
  2. public MyThread(){
  3. System.out.println("---MyThread begin---");
  4. System.out.println("Thread.currentThread.getName()=" +Thread.currentThread().getName());
  5. System.out.println("this.getName()=" + this.getName());
  6. System.out.println(Thread.currentThread() == this);
  7. System.out.println("---MyThread begin---");
  8. }
  9. @Override
  10. public void run(){
  11. System.out.println("---run begin---");
  12. System.out.println("Thread.currentThread.getName()=" +Thread.currentThread().getName());
  13. System.out.println("this.getName()=" +this.getName());
  14. System.out.println(Thread.currentThread() == this);
  15. System.out.println("---run end ---");
  16. }
  17. public static void main(String[] args) throws InterruptedException {
  18. MyThread tt = new MyThread();
  19. Thread t1 = new Thread(tt);
  20. t1.setName("test");
  21. t1.start();
  22. }
  23. }

输出:

  1. ---MyThread begin---
  2. Thread.currentThread.getName()=main //实体是指现在正在发生的线程:main线程
  3. this.getName()=Thread-0 //实例:当前实例是“死的线程”,默认赋值是:Thread-0
  4. false //    实体并不是实例
  5. ---MyThread begin---
  6. ---run begin---
  7. Thread.currentThread.getName()=test //实体是指现在正在发生的线程:test线程
  8. this.getName()=Thread-0 //实例:当前实例是“死的线程”,默认赋值是:Thread-0
  9. false //当前的实体是:test 并不是,tt这个对象的死线程
  10. ---run end ---

调用MyThread构造函数的是main线程

Thread.currentThread().getName()=main

Thread.currentThread().isAlive()=true

而此时还没有启动MyThread子线程,所以打印出

this.getName=Thread-0

this.isAlive()=false

此时this代表的是MyThread对象实例,所以

Thread.currentThread()==this :false

this.getName() = Thread-0 是为什么呢

通过查看Thread源码发现,在Thread类的构造方法中,默认会自动给name赋值:

  1. public Thread(Runnable target) {
  2. init(null, target, "Thread-" + nextThreadNum(), 0);
  3. }

在Thread源码中实际上new Thread(tt)会将tt应用的对象绑定到一个private变量target上,

在t1被执行的时候即t1.run()被调用的时候,它会调用target.run()方法,

也就是说它是直接调用tt对象的run方法,也就是说,在run方法被执行的时候,

this.getName()实际上返回的是target.getName(),而Thread.currentThread().getName()实际上是t1.getName()

修改代码直接执行MyThread的线程:

  1. public static void main(String[] args) throws InterruptedException {
  2. MyThread tt = new MyThread();
  3. tt.setName("test");
  4. tt.start();
  5. }

输出:

  1. ---MyThread begin---
  2. Thread.currentThread.getName()=main
  3. this.getName()=Thread-0
  4. false
  5. ---MyThread begin---
  6. ---run begin---
  7. Thread.currentThread.getName()=test
  8. this.getName()=test
  9. true
  10. ---run end ---

总结几点:

  • 一个进程里main是一开始就活着的,但是,它跟main方法半毛钱关系都没有,仅仅是同名罢了
  • 谁调用了start函数,谁才把自己交给线程调度器,谁才是活着的线程,否则,管你继承啥,还是实现啥,都是一个普通的对象
  • 实现了Runable接口的对象具有运行线程的资格,但是,只要它不被start,它就是一个普通的对象,有资格,并不代表它就是线程,线程是活着的东西,对象是死的
  • 线程可以级级包裹嵌套,就像上边一样,它运行的是:target的run
  • 自己调用run的话,仅仅就是一个函数调用,要让调度器去调用,它才是一个线程
时间: 2024-08-21 20:42:10

Thread.currentThread().getName() 和 this.getName()区别详解的相关文章

lock与synchronized区别详解

1.线程与进程: 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程. 线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位. 2.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.sleep()方法,线程进入等待.e.run()方法,直接执行线程的run()方法,但是线程调用start()方法

【转】Cookie和Session的区别详解

转载地址:http://www.phperzone.cn/portal.php?aid=541&mod=view 一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择 二.会话cookie和持久cookie的区别 如果不设置

【转】escape()、encodeURI()、encodeURIComponent()区别详解

escape().encodeURI().encodeURIComponent()区别详解 原文链接:http://www.cnblogs.com/tylerdonet/p/3483836.html JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 下面简单介绍一下它们的区别 1 escape()函数 定义和用法 e

cookie 和session 的区别详解 《转》

二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie 里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie 来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 C

escape()、encodeURI()、encodeURIComponent()区别详解

JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 下面简单介绍一下它们的区别 1 escape()函数 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string) 参数  描述  string  必需.要被转义或编码的字符串. 返回值 已编码的

Bind和Eval的区别详解

原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名") %> 区别 1.eval是只读数据,bind是可更新的. 2.当对次表达式操作时候,必须用Eval 如<%# Eval("字段名").ToString().Trim() %> 2.若GridView中绑定列里面 设置 内容格式 DataFormateStri

PHP中include和require的区别详解

1.概要  require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句).这就意味着如果可能执行多次的代码,则使用require()效率比较高.另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句. require的使用方法如:require("myfil

jQuery height()、innerHeight()、outerHeight()函数的区别详解

jQuery height().innerHeight().outerHeight()函数的区别详解 在jQuery中,获取元素高度的函数有3个,它们分别是height(). innerHeight().outerHeight(). 与此相对应的是,获取元素宽度的函数也有3个,它们分别是width(). innerWidth().outerWidth(). 在这里,我们以height().innerHeight().outerHeight()3个函数为例,来详细介绍它们之间的区别. 下面我们以元

jsp中的@include与jsp:include区别详解

1 前言 搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式 <%@include file="xxx.jsp"%> <jsp:include page="xxx.jsp"></jsp:include> 我们也许会使用这两种方式,但是也许很多人不名称这两种方式的区别.下面我们来看看下面的两个例子 2 开门见山引出问题 (1) /include/include.jsp <%@ page language=&