Java并发编程(二)——Thread.currentThread()研究
2016-03-21 12:13
615 查看
Java并发编程(二)——Thread.currentThread()研究
一,存在的问题
Thread.currentThread()是Thread的一个静态方法,用来获取当前线程对象的一个引用。问题在于为什么不简单的用this来获取,而单独写了一个静态的currentThread()方法来获取当前线程呢?
二,一个小demo
首先看一个小例子,该例子引用自知乎https://www.zhihu.com/question/20944522public class Demo { public static void main(String[] args) { MyThread mt = new MyThread(); new Thread(mt).start(); new Thread(mt, "Name1").start(); new Thread(mt, "Name2").start(); System.out.println(Thread.currentThread().getName()); // main主方法 // System.out.println(this.getName()); // this获取不到线程对象 } } class MyThread extends Thread { @Override public void run() { try { Thread.sleep(3000); Thread t = Thread.currentThread(); System.out.println("当前线程名字:" + t.getName() + " 当前线程的优先级别为:"+ t.getPriority() + " ID:" + t.getId()); // System.out.println("当前线程名字:" + this.getName() + " 当前线程的优先级别为:" + this.getPriority() + " ID:"+ this.getId()); } catch (InterruptedException e) { e.printStackTrace(); } } }
上面这个例子的执行结果是:
main 当前线程名字:Thread-1 当前线程的优先级别为:5 ID:10 当前线程名字:Name1 当前线程的优先级别为:5 ID:11 当前线程名字:Name2 当前线程的优先级别为:5 ID:12
这个结果应该是没什么问题的,切换注释后(main中的注释切换后编译错误,这很好理解)执行的结果是:
main 当前线程名字:Thread-0 当前线程的优先级别为:5 ID:9 当前线程名字:Thread-0 当前线程的优先级别为:5 ID:9 当前线程名字:Thread-0 当前线程的优先级别为:5 ID:9
这个结果如何解释呢?为什么输出的都一样呢?
其实这时的this并不是new Thread(mt),new Thread(mt, “Name1”)以及new Thread(mt, “Name2”),而是mt,所以输出一致,都是mt的名称和id。
三,总结
Thread提供静态方法currentThread()来供我们调用,既可以避免this无法获取到main线程的问题,又可以避免this无法获取到Thread t2=new Thread(Thread t)来开启的线程的问题,可以说currentThread方法可以在所有场合获取到正确的当前线程。当然,具体底层实现是由C语言实现的,不需要深究。相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树