• 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()方法并不会创建线程,它只会返回当前正在执行的的线程对象。

  • 相关阅读:
    zombie处理
    exec
    fork
    udp program
    PS中进程状态
    关闭socket连接最好的方法
    setsockopt
    【Python】Webpy 源码学习
    web.py 安装
    WSGI、flup、fastcgi、web.py的关系
  • 原文地址:https://www.cnblogs.com/tfxz/p/12621490.html
Copyright © 2020-2023  润新知