Thread.currentThread().getName() 和 this.getName()区别详解
来源:互联网 发布:安卓6.0可用java模拟器 编辑:程序博客网 时间:2024/06/06 00:43
最近在看java多线程编程核心技术这本书,由于一直对于线程的应用和学习不深,在例子中碰到Thread.currentThread().getName() 和 this.getName()的问题很困惑,刚弄懂分享下,有不对的地方还请多多指教。
public class MyThread extends Thread { public MyThread(){ System.out.println("---MyThread begin---"); System.out.println("Thread.currentThread.getName()=" +Thread.currentThread().getName()); System.out.println("this.getName()=" + this.getName()); System.out.println(Thread.currentThread() == this); System.out.println("---MyThread begin---"); } @Override public void run(){ System.out.println("---run begin---"); System.out.println("Thread.currentThread.getName()=" +Thread.currentThread().getName()); System.out.println("this.getName()=" +this.getName()); System.out.println(Thread.currentThread() == this); System.out.println("---run end ---"); } public static void main(String[] args) throws InterruptedException { MyThread tt = new MyThread(); Thread t1 = new Thread(tt); t1.setName("test"); t1.start(); }}
---MyThread begin---Thread.currentThread.getName()=mainthis.getName()=Thread-0false---MyThread begin------run begin---Thread.currentThread.getName()=testthis.getName()=Thread-0false---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赋值:
public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); }
在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的线程:
public static void main(String[] args) throws InterruptedException { MyThread tt = new MyThread(); tt.setName("test"); tt.start(); }
---MyThread begin---Thread.currentThread.getName()=mainthis.getName()=Thread-0false---MyThread begin------run begin---Thread.currentThread.getName()=testthis.getName()=testtrue---run end ---
此时MyThread构造方法和之前的输出保持一致,因为执行构造方法时线程还没有执行,所以输出this.getName=Thread-0 ;而run方法中MyThread线程已经执行并且可以获取到线程的名称,所以输出:
Thread.currentThread.getName()=test
this.getName()=test
- Thread.currentThread().getName() 和 this.getName()详解
- Thread.currentThread().getName() 和 this.getName()区别详解
- 并发this.getName()和Thread.currentThread().getName()区别
- 多线程this.getName()和Thread.currentThread().getName()
- currentThread().getName和this.getName()的区别
- Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别
- Thread.currentThread().getName()与this.getName()的区别
- 多线程当中this.name和Thread.currentThread.getName的区别
- 多线程中this.getName()和Thread.currentThread().getName()
- Thread.CurrentThread.getName 与 this.getName()
- 【java】多线程中Thread.currentThread().getName()和this.getName()的区别
- Java多线程中this.getName()和Thread.currentThread.getName()的区别?
- JAVA 多线程 this.getName()与Thread.currentThread().getName()
- 有关多线程中this.getName()和Thread.currentThread().getName()返回名字不一样的问题
- 多线程中this.getName()和Thread.currentThread().getName()返回名字不一样的问题
- Thread.currentThread().getName()…
- Thread.currentThread().getName()
- 多线程的this.getName()与Thread.currentThread().getName为何有时不一样
- 自定义控件的实现
- 利用githug来练习git,如何安装
- Hibernate----环境搭建
- LeetCode 8 String to Integer (atoi)
- Xamarin开发教程如何使用Xamarin开发Android应用
- Thread.currentThread().getName() 和 this.getName()区别详解
- java 监听器和监听器模式
- Android 百分比布局讲解
- OpenGL ES 2.0 - 绘制方式
- Android开发之RecyclerView优秀文集,从入门到精通
- 浅谈 SQL 中的锁(一)余额问题
- R语言学习六
- 关于整合springmvc的时候出现的两个磨人的问题
- 数值分析 第三章 线性方程组的迭代法