Thread.currentThread()与this的区别
来源:互联网 发布:java bigdecimal取整 编辑:程序博客网 时间:2024/06/06 00:52
参考资料:http://blog.csdn.net/yezis/article/details/57513130
在自定义线程类时,如果线程类是继承java.lang.Thread的话,那么线程类就可以使用this关键字去调用继承自父类Thread的方法,this就是当前的对象。
另一方面,Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用。
尽管this与Thread.currentThread() 都可以获取到Thread的引用,但是在某种情况下获取到的引用是有差别的。
线程类:
package com.ice.thread;class CountOperate extends Thread { public CountOperate() { System.out.println("CountOperate--begin"); System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());//当前所处线程的引用 System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());//isAlive()判断当前线程是否处于活动状态 System.out.println("this.getName()="+this.getName());//this实际上是指CountOperate类的引用 System.out.println("this.isAlive()="+this.isAlive()); System.out.println("Thread.currentThread() == this : " + (Thread.currentThread() == this)); System.out.println("CountOperate--end"); } @Override public void run() { System.out.println("run--begin"); System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName()); System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive()); System.out.println("this.getName()="+this.getName()); System.out.println("this.isAlive()="+this.isAlive()); System.out.println("Thread.currentThread() == this : " + (Thread.currentThread() == this)); System.out.println("run--end"); }}
测试类:
package com.ice.thread;public class Run { public static void main(String[] args) { CountOperate countOperate = new CountOperate(); System.out.println("main begin countOperate isAlive()="+countOperate.isAlive());//countOperate是否处于活动状态 countOperate.setName("countOperate");//给countOperate线程类名称赋值 countOperate.start(); System.out.println("main end countOperate isAlive()="+countOperate.isAlive()); }}
测试结果:
CountOperate--beginThread.currentThread().getName()=mainThread.currentThread().isAlive()=truethis.getName()=Thread-0this.isAlive()=falseThread.currentThread() == this : falseCountOperate--endmain begin countOperate isAlive()=falsemain end countOperate isAlive()=truerun--beginThread.currentThread().getName()=countOperateThread.currentThread().isAlive()=truethis.getName()=countOperatethis.isAlive()=trueThread.currentThread() == this : truerun--end
分析:
我们会发现this 与 Thread.currentThread()是同一个引用。
先说构造方法中的代码结果:
Thread.currentThread().getName()=mainThread.currentThread().isAlive()=true
这个结果是指实例化MyThread,调用MyThread构造方法是主线程main。
this.getName()=Thread-0this.isAlive()=false
现在,这个this是什么?MyThread的引用,是个线程类,但是这个线程类并没有设置名字,所以Thread默认给了一个Thread-0。
默认名字的规则定义如下:
因为仅仅是运行构造方法,还未运行线程,所以this.isAlive() = false。
之后是run()中的代码结果:
Thread.currentThread().getName()=countOperateThread.currentThread().isAlive()=true
当前线程名字为countOperate,countOperate是我们手动赋予的myThread.setName(“countOperate”);,并且它是运行着的。
this.getName()=countOperatethis.isAlive()=true
因为,我们运行的线程就是MyThread的引用,而this也是MyThread的引用,所以打印结果与Thread.currentThread()相同,
并且Thread.currentThread() == this : true
当我们保持线程类不变,如下修改测试类:
package com.ice.thread;public class Run { public static void main(String[] args) { CountOperate countOperate = new CountOperate(); Thread t1 = new Thread(countOperate);// 将线程对象以构造参数的方式传递给Thread对象进行start()启动线程 System.out.println("main begin t1 isAlive()="+t1.isAlive()); t1.setName("t1"); t1.start(); System.out.println("main end t1 isAlive()="+t1.isAlive()); }}
测试结果如下:
CountOperate--beginThread.currentThread().getName()=mainThread.currentThread().isAlive()=truethis.getName()=Thread-0this.isAlive()=falseThread.currentThread() == this : falseCountOperate--endmain begin t1 isAlive()=falsemain end t1 isAlive()=truerun--beginThread.currentThread().getName()=t1Thread.currentThread().isAlive()=truethis.getName()=Thread-0this.isAlive()=falseThread.currentThread() == this : falserun--end
会发现,我们会发现this 与 Thread.currentThread()不是同一个引用.
将线程对象以构造参数的方式传递给Thread对象进行start()启动线程,我们直接启动的线程实际是t1,而作为构造参数的countOperate,赋给Thread类中的属性target,之后在Thread的run方法中调用target.run();
此时Thread.currentThread()是Thread的引用t1, 而this依旧是countOperate的引用,所以是不一样的,打印的内容也不一样.
以上大多来自于引用的博客,我自己的理解是:
在哪个类中使用this,那这个this就代表哪个类;Thread.currentThread()永远代表当前它所处的线程。
- Thread.currentThread()与this的区别
- Thread.currentThread()与this的区别
- Thread.currentThread()与this的区别
- 多线程中this、Thread.currentThread()和this.currentThread()的区别
- Thread.currentThread().getName()与this.getName()的区别
- Java多线程--详解this与Thread.currentThread()的区别
- java--this与Thread.currentThread()区别
- this与Thread.currentThread
- this和Thread.currentThread的区别
- Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术
- Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术
- Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术
- 06_多线程中的This和Thread.currentThread()的区别
- 多线程当中this.name和Thread.currentThread.getName的区别
- Thread.CurrentThread.getName 与 this.getName()
- this和currentThread的区别
- JAVA多线程编程之Thread中This和Thread.CurrentThread的区别
- 【java】多线程中Thread.currentThread().getName()和this.getName()的区别
- Linux下用户组、文件权限详解
- Javascript Hoisting( 变量提升)
- 学习极客的mongoose+express的笔记(2)
- iOS 读取图片 exif 信息
- 上拉加载
- Thread.currentThread()与this的区别
- 栈
- cdq分治(bzoj 1176: [Balkan2007]Mokia && bzoj 2683: 简单题)
- C语言栈的使用
- guzzle/guzzle 日常使用
- 禁止Ctrl+鼠标滚轴浏览器页面缩放
- Java的堆、栈和垃圾回收
- Android自定义View构造函数、自定义属性详解
- 关于retrofit 传值传null的处理(同样适用于okhttp)