1. Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用。

2. 如果调用isInterrupted返回true,this就是当前线程对象,此时Thread.currentThread()与this表示同一对象。否则,就必须使用Thread.currentThread()获取当前线程。

3.调用Thread.currentThread()方法的时候多半是不知道调用的是哪一个线程的。

public class MyThread extends Thread {

    public MyThread(){

        System.out.println("------" + "构造函数开始" + "------");
Thread testThread = Thread.currentThread();
System.out.println("Thread.currentThread().getName() = " + testThread.getName());
System.out.println("Thread.currentThread().isAlive() = " + testThread.isAlive());
System.out.println("this.getName() = " + this.getName());
System.out.println("this.isAlive() = " + this.isAlive());
System.out.println("Thread.currentThread() == this : " + (testThread == this));
System.out.println("------" + "构造函数结束" + "------"); } @Override
public void run(){ Thread testThread = Thread.currentThread();
System.out.println("------" + "run()开始" + "------");
System.out.println("Thread.currentThread().getName() = " + testThread.getName());
System.out.println("Thread.currentThread().isAlive() = " + testThread.isAlive());
System.out.println("this.getName() = " + this.getName());
System.out.println("this.isAlive() = " + this.isAlive());
System.out.println("Thread.currentThread() == this : " + (testThread == this));
System.out.println("------" + "run()结束" + "------"); } public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.setName("A");
myThread.start();
}
}
------构造函数开始------
Thread.currentThread().getName() = main
Thread.currentThread().isAlive() = true
this.getName() = Thread-0
this.isAlive() = false
Thread.currentThread() == this : false
------构造函数结束------
------run()开始------
Thread.currentThread().getName() = A
Thread.currentThread().isAlive() = true
this.getName() = A
this.isAlive() = true
Thread.currentThread() == this : true
------run()结束------

查看Thread的源码可以发现

    public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}

1. 不指定Thread名字时,Thread会自动给name赋值,此时this指向的MyThread子线程,但子线程还没有启动所以

所以:在构造函数中this.getName() = Thread-0

2. 然后myThread子线程启动

------run()开始------
Thread.currentThread().getName() = A
Thread.currentThread().isAlive() = true
this.getName() = A
this.isAlive() = true
Thread.currentThread() == this : true
------run()结束------

程序若执行main方法

执行结果,此时的this和Thread.currentThread()指向不是同一个线程实例。
也就是说,this指向的还是new MyThread()创建的那个线程实例,而不是new Thread(thread)创建的那个实例即thread。

https://blog.csdn.net/smartboy_01/article/details/89356010

最新文章

  1. Atitit zxing二维码qr码识别解析
  2. JAVA 1.1
  3. C# MVC ( 添加路由规则以及路由的反射机制 )
  4. java使用正则表达式验证IP V4、 IP V6
  5. Android混淆打包配置总结
  6. 关于CSS的一些总结
  7. Oracle计算时间函数(numtodsinterval、numtoyminterval)
  8. C# 压缩打包文件下载
  9. Learning Java 8 Syntax (Java in a Nutshell 6th)
  10. 8.23.1 IO-输入输出流概念
  11. java 函数初始化作用
  12. 【原创精品】mac 彻底卸载趋势科技
  13. 【Coucurrency-CountDownLatch】-20161203-0002
  14. [转]Examining Open vSwitch Traffic Patterns
  15. BZOJ2151种树——模拟费用流+链表+堆
  16. [转帖]Intel新一代Xeon完整曝光
  17. 吴裕雄 python 爬虫(1)
  18. Oracle与Sql server 在SQL上的不同
  19. 关于FSMC地址线的理解
  20. JBPM学习第6篇:通过Git导入项目

热门文章

  1. Vue中复制文本 vue-clipboard2
  2. Net Core3.1 添加 Swagger
  3. Adapter之GridAdapter
  4. 用 Weave Scope 监控集群【转】
  5. VMware Tools 组件、配置选项和安全要求
  6. 【pwnable.kr】 brainfuck
  7. leetCode242 有效的字母异位词
  8. PreparedStatement 和 Statement 的区别(推荐使用PreparedStatement)
  9. 向量容器vector操作
  10. 99乘法表(for循环嵌套)