博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thread.currentThread()和this的区别——《Java多线程编程核心技术》
阅读量:4983 次
发布时间:2019-06-12

本文共 2285 字,大约阅读时间需要 7 分钟。

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


具体代码如下:

1 public class MyThread09 extends Thread { 2  3     public MyThread09() { 4         System.out.println("MyThread09 Constructor begin"); 5         System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName()); 6         System.out.println("this.getName()=" + this.getName()); 7         System.out.println("MyThread09 Constructor end"); 8     } 9 10     @Override11     public void run() {12         System.out.println("run begin");13         System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName());14         System.out.println("this.getName()=" + this.getName());15         System.out.println("run end");16 17     }18 19     public static void main(String[] args) {20         MyThread09 thread = new MyThread09();21 //        thread.setName("B");22         Thread thread1 = new Thread(thread);23         thread1.setName("A");24         thread1.start();25 }

输出结果如下:

分析:

这里将MyThread09的对象作为参数传递给Thread的构造函数,相当于将MyThread09线程委托给thread1去执行,理解这里是非常重要的。

在MyThread09的构造函数中打印如下内容:

1 MyThread09 Constructor begin2 Thread.currentThread.getName()=main3 this.getName()=Thread-04 MyThread09 Constructor end

第2行:当前线程名为main

第3行:this.getName()=Thread-0 

首先看Thread.currentThread方法源码:

该方法为native的静态方法,返回正在执行该段代码的线程对象。

这里MyThread09的构造函数是由main线程执行的,所有Thread.currentThread.getName()=main

再看this.getName()=Thread-0.首先我们看Thread的构造函数源码:

在初始化线程对象的时候会默认为线程名赋值,格式为“Thread-”的形式。这里的this指的是当前对象,而当前对象就是MyThread09对象,所以打印Thread-0。

再看其run方法的打印日志:

1 run begin2 Thread.currentThread.getName()=A3 this.getName()=Thread-04 run end

由于我们将MyThread09对象委托给thread1去执行的,所以此时Thread.currentThread.getName()=A,而此时this对象还是表示的MyThread09,所以this.getName()=Thread-0。

将21行注释打开,运行结果如下:

1 MyThread09 Constructor begin2 Thread.currentThread.getName()=main3 this.getName()=Thread-04 MyThread09 Constructor end5 run begin6 Thread.currentThread.getName()=A7 this.getName()=B8 run end

在MyThread09执行构造函数时,还未调用setName方法,所以this.getName()=Thread-0,在执行run方法时,已为其赋值,所以this.getName()=B。

通过以上分析,可明确清楚Thread.currentThread和this的区别:

①Thread.currentThread表示当前代码段正在被哪个线程调用的相关信息。

②this表示的是当前对象,与Thread.currentThread有很大的区别。


by Shawn Chen,2018.12.5日,下午。

转载于:https://www.cnblogs.com/developer_chan/p/10070067.html

你可能感兴趣的文章
软件说明
查看>>
ebook-nodej
查看>>
Qt学习(14)
查看>>
015_NGINX作为WebSocket Proxy的设置
查看>>
NOIP2011T2 统计单词数
查看>>
springboot情操陶冶-@Conditional和@AutoConfigureAfter注解解析
查看>>
每日5min分享-接口测试框架
查看>>
超好用超短的小程序请求封装
查看>>
Android开发随手记
查看>>
PHP 解析Url 面向对象
查看>>
nodejs express route 的用法
查看>>
Python多线程
查看>>
java IO整理-File
查看>>
粗谈Springboot框架,众所周知Springboot是有spring推出的微服务框架,什么是微服务框架呢!...
查看>>
家庭记账本六
查看>>
离钱越近,才能赚钱越‘稳’
查看>>
mapping.mapper.xml文件中的标签详解
查看>>
duilib中各控件响应的消息类型
查看>>
链表翻转
查看>>
JS常见算法题目
查看>>