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

首先要知道Thread类有9个构造方法,因为也是初学,所以只用到了2个构造方法.先列出待会需要用到的源代码.

1) 无参的构造方法, 注意里面的nextThreadNum()这个方法.

里面是一个静态的变量,没调用一次无参构造器,就执行++操作

2) 带有一个Runnable对象的构造方法,因为Thread是实现Runnable方法的.所以可以传入一个Thread对象.

接下来分析为什么会出现不同的name...上代码.

① 构造方法: Thread.currentThread.getName(): 构造方法是由main方法调用的. 方法获取到的名字是当前线程的名字.main方法也是一个线程,是一个主线程.

      this.getName(): 这个方法中的this,代表本类对象,在代码中是MyThread 所以这个方法获得的名字是Thread-0

      因为上面的源代码中给出了"Thread-"+nextThreadNum() 所以第一次调用的时候 会赋值为一个初始0,第二次就是Thread-1了.

② run方法: Thread.currentThread.getName():  run方法是由我们new 出来的MyThread() 调用start方法执行的.所以 Thread.currentThread.getName(): 的结果是Thread-0

      this.getName(): 这个方法中的this,代表本类对象,在代码中是MyThread 所以这个方法获得的名字是Thread-0

      可能会有疑惑,为什么都是Thread-0 而不是Thread-1呢? 后面会讲解到.

③总结: 如果是直接new一个自定义对象不交给 Thread线程执行调用 在其内部外部 使用 Thread.currentThread().getName()  ,对象实例.getName() 和 this.getName(),这3个区别都不存在,都是相同的,因为没有交给Thread执行,直接调用的当前实例本身

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

① 构造方法: 同上 没什么可说的.

② run方法:  this.getName():  获取到的是new Mythread()这个类的对象.

      Thread.currentThread().getName(): 获取到的是new Thread(myThread)这个类的对象.

      因为获取到的是两个不同的对象,所以会出现Thread-0 和Thread-1

      而且threadInitNumber这个变量是一个静态的. nextThreadNum()这个方法是synchronized修饰的,不会造成同步问题.

总结:  实际上new Thread(myThread)会将myThread应用的对象绑定到一个pravite变量target上,在thread被执行的时候.即thread.run()被调用的时候,它会调用target.run()方法,

    也就是说它是直接调用thread对象的run方法,

    再确切的说,再run方法被执行的时候,this.getName()实际上返回的是target.getName()

    而Thread.currentThread().getName()实际上是thread.getName()

传送门: 里面有根据<Java多线程编程>这本书敲得代码,需要可以去拿 https://github.com/fk123456/MyThreadTest

参考自两位大牛的博客:https://www.cnblogs.com/signheart/p/922dcf75dd5fe6b418d4475af89c4664.html

https://www.cnblogs.com/huangyichun/p/6071625.html

Java的Thread.currentThread().getName() 和 this.getName() 以及 对象.getName()区别???的更多相关文章

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

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

  2. java:JQuery(声明,JQ和JS对象的区别,prop,attr,addClass,offset,trigger,dblclick和change事件,hide,show,toggle,slideUp,slideDown,slideToggle,三种选择器,标签的获取,三张图片的放大与缩小)

    1.JQuery: jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计 的宗旨是“ ...

  3. Java多线程中thread.getname()和thread.currentThread().getName();的去别

    首先要明白 this.XXX 的使用场景 使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但 ...

  4. Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别

    原文链接:http://www.cnblogs.com/signheart/p/922dcf75dd5fe6b418d4475af89c4664.html 使用Thread.currentThread ...

  5. [Java多线程]-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. Thread.currentThread与this的区别

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

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

    currentThread的详解 currentThread方法是Thread类的一个静态方法,用来获取当前运行的代码段,正在被哪个线程调用.我们先来看一眼源码. 是一个native方法.直接与系统层 ...

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

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

  9. Thread.currentThread().setContextClassLoader为什么不生效与java.lang.NoClassDefFoundError之Java类加载的Parent first Classloader

    众所周知,Java的类加载机制采用了双亲委派模型,导致在进行类加载的时候会有多个加载器,这种复杂的机制,有时候会导致‘Exception in thread main java.lang.NoClas ...

随机推荐

  1. 虚拟机上CentOS-6.9-x86_64系统安装教程

    最近想学学Linux系统如何使用,于是想用VM安装虚拟机学习一下. linux系统比较多,我这里用的是CentOS-6.9-x86_64 一.下载系统 下载地址:https://www.centos. ...

  2. 用python写了一个猜年龄小游戏

    写一个猜年龄游戏: 需要实现用户登录的功能 初始用户登录信息为 {'hades': '13579','nick': '123','ruixing': 'a1','fanping': 'b2'} 登录时 ...

  3. PAT 1085 PAT单位排行

    每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤10^5),即考生人数.随后 N 行,每行按下列格式给出一个考生的信 ...

  4. PAT 1133 Splitting A Linked List

    Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...

  5. 【Codeforces 382C】Arithmetic Progression

    [链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...

  6. 九度oj 题目1050:完数

    题目1050:完数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8778 解决:3612 题目描述: 求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子 ...

  7. 转载 - Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)

    出处:http://www.cnblogs.com/ifantastic/p/3185665.html Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LT ...

  8. springboot 2.x 集成 drools 7.x

    简介:springboot 2.0.4.RELEASE 集成 drools 7.11.0.Final 1.项目结构 2. pom.xml文件 <?xml version="1.0&qu ...

  9. samba 奇怪问题

    有一个centos 7  samba服务器,配置如下: [root@proxy223 20150331]# cat /etc/samba/smb.conf [global] workgroup = W ...

  10. 输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来

    中兴面试题之中的一个.难度系数中. 题目描写叙述例如以下:输入两个整数n 和m,从数列1,2.3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来. 逻辑分析: 1.比 ...