[toc]

本系列参考资料《JAVA多线程编程核心技术》
关注公众号:雨中散步撒哈拉,回复:025
进行下载资料

本篇研究话题,当前运行线程是谁?
也就是线程中的Thread.currentThread().getName()和this.currentThread().getName()之间的区别?
线程间是混乱的,那么自己学的时候,尽量清晰些!才能如德芙般丝滑!!

零、前言

image

线程是分阶段的,每一阶段都存在探讨的问题,为了后边测试和研究各阶段的问题,本篇作为前驱,首先对线程进行透明化:我要知道我目前研究的线程是谁?我要知道目前线程正在干什么?目前线程可能要发生什么事情?

主要区分

  1. Thread.currentThread().getName()
  2. this.currentThread().getName()

个人理解
Thread.currentThread():调用者的线程 或者理解为外部线程
this.currentThread():执行者的线程 或者理解为内部线程
调用者和执行者:这俩个名称是个人理解哈
有的人也称外部线程和内部线程!

一、简单接触下

package com.multithreading.demo;

public class MyCurrentThreadTest {

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}

发现打印为main,该值为main线程的名称。也就是我们的这部分程序被main线程调用或者执行了!
image.png

二、探讨升级

线程类代码:

package com.multithreading.demo;

public class MyCurrentThread extends Thread{


    public MyCurrentThread() {
        System.out.println("构造方法打印ThreadName=" + Thread.currentThread().getName());
        System.out.println("构造方法打印thisName=" + this.getName());
    }

    @Override
    public void run() {
        System.out.println("run方法打印ThreadName=" + Thread.currentThread().getName());
        System.out.println("run方法打印thisName=" + this.getName());
    }
}

调用者代码:

package com.multithreading.demo;

public class MyCurrentThreadTest {

    public static void main(String[] args) {
        MyCurrentThread myCurrentThread = new MyCurrentThread();
        myCurrentThread.start();
    }
}

执行结果:
image.png

结果解析:
构造方法打印ThreadName=main
构造方法打印thisName=Thread-0

先说构造方法,构造方法是在main方法中实例化自定义线程类执行的,所以外部线程或者调用者为main,即ThreadName=main
this打印的时候为内部线程或者当前执行线程,就是MyCurrentThread自定义线程的线程名称!那为什么为Thread-0名称呢?
查看Thread代码如下:
image.png
当没有给定要执行的线程名称,Thread会随机生成一个名称!

构造方法中的名称有区分开嘛?

  1. 构造方法调用者或者外部线程:main线程(这个很好理解,我们调用都是在main方法中执行的)
  2. 构造方法的执行者或者内部线程:this当前MyCurrentThread自定义线程(就是谁的东西,归谁执行)

run方法打印ThreadName=Thread-0
run方法打印thisName=Thread-0

run方法调用者和执行者都是Thread-0
main方法实例化完成自定义的MyCurrentThread线程类时,调用start进行执行(我调我自己,哎 就是玩!哈哈)
所以调用者和执行者(外部线程和内部线程)都是之前自动生成的Thread-0

三、探讨升级-线程嵌套

自定义线程类代码:

package com.multithreading.demo;

public class MyCurrentThread extends Thread{


    public MyCurrentThread() {
        System.out.println("构造方法打印ThreadName=" + Thread.currentThread().getName());
        System.out.println("构造方法打印thisName=" + this.getName());
    }

    @Override
    public void run() {
        System.out.println("run方法打印ThreadName=" + Thread.currentThread().getName());
        System.out.println("run方法打印thisName=" + this.getName());
    }
}

调用线程代码:

    public static void main(String[] args) {
        MyCurrentThread myCurrentThread = new MyCurrentThread();
        Thread thread = new Thread(myCurrentThread);
        thread.setName("thread");
        thread.start();
    }

执行结果:
image.png

结果解析:
构造方法打印ThreadName=main
构造方法打印thisName=Thread-0

构造方法结果,如第二部分所说!

run方法打印ThreadName=thread
run方法打印thisName=Thread-0

run方法发现有区别
ThreadName为自定义的thread名称,thisName还是自定义的线程类MyCurrentThread的线程名称?
为什么不一样呢?就因为把自定义的线程放到了Thread中???

查看Thread源代码

  1. 查看构造方法
    image.png

  2. 查看init方法,发现target重新赋值
    image.png

  3. 全局查看target使用,发现target直接执行了run方法
    image.png

  4. 去除干扰
    有第三步知道target直接执行了run方法,就像一个调用普通方法一样,测试如下:
    image.png

总结:
ThreadName为thread,就是调用者thread调用自定义线程类(或者也可以是第四步中的main)
thisName为Thread-0 是因为源码为target.run(),所以Thread-0为target执行者的线程名称!

Q.E.D.


只有创造,才是真正的享受,只有拚搏,才是充实的生活。