currentThread()  到底是什么? 其实currentThread() 只是Thread 的一个静态方法。返回的正是执行当前代码指令的线程引用:

    /**
* Returns a reference to the currently executing thread object.
*
* @return the currently executing thread.
*/
public static native Thread currentThread();

换句话说, Thread.currentThread() 返回的是 一个实例。 只不过呢, 这个实例确实比较特殊。 这个实例是当前Thread 的引用。Thread.currentThread() 当然 不等于 Thread。

问题1 :

之前一直存在的一个问题是:

Thread.currentThread().sleep(x)

Thread.sleep(x)

两者到底有什么区别,Thread.currentThread() 这样的写法是必须的吗。 到底哪种写法更好呢?

那为什么我们有常常看到:

Thread.currentThread().sleep(2000);

这样的用法呢??

其实,如果我们代码这么写:

Thread.currentThread().sleep(2000);

会有下面的提示, 当然这个提示也不算是什么错误。但是总归是不太好的。因为这个提示有点警告的意味。

Static member 'java.lang.Thread.sleep(long)' accessed via instance reference less... (Ctrl+F1)
Shows references to static methods and fields via class instance rather than a class itself.

它 的意思是说, 你正在通过一个对象实例来调用它的静态方法。 (一般来说, 这确实是不好的编程实践。)

但是改成下面这样就好了:
Thread.sleep(2000);

但是,当年,我看视频看别人代码,都是这么写的。 事实上,虽然两者效果完全一样,都没错,但是还是细微差别的。那么,哪个是最佳实践呢? 答案是后者: Thread.sleep(x) 

本质上来讲, 其实是没有区别的,其功效完全一样。不过呢, 一些代码检查工具会认为  前者有点问题。

While you can call a static method via an instance reference, it's not good style ———— 这个就是代码检查工具提示判断的 依据。 不是一个好的 style。

Thread.currentThread().sleep(2000); 这样 就可以让这行代码看起来 达到了某些程序员的“原本的心意”。 虽然这样做是无益的,但是也是无害的。 总之,它可以避免某些问题,可以避免某些程序员出现低级错误。。。  这个其实是早期程序员的一个通用的写法, 无益也无害。 已经成为了一个不那么好的习俗了吧

In Java, sleep is a static method. Both your examples do exactly the same thing, but the former version is confusing because it looks like it is calling a method on a specific object but it's not doing that at all. In your example it won't matter much, but it is more dangerous if you have the following:

someOtherThread.sleep(x);

This time it looks like you are telling some other thread to sleep, but in fact you are putting the current thread to sleep. The way to avoid making this type of mistake is to always call static methods using the class rather than a specific object.

The way to avoid making this type of mistake is to always call static methods using the class rather than a specific object. —— 避免了“调用一个实例的静态方法,而实际上应该是调用一个类的静态方法” 之类的错误。 其实说白了也就是避免这样的错误:   someOtherThread.sleep(x);

问题2:

还有一个问题是: Thread.currentThread()与this的区别

在线程的run 方法内部, Thread.currentThread()与this 其实是一个意思(除非你手动执行run方法,而不是通过启动线程的方式)。 不过呢, 其他的某些方法或场合,却可能出现不一致。

一般来说,Thread.currentThread() 用于不方便使用this 的场合。 Thread.currentThread() 明确表明了它所针对的对象是 当前线程! 不是this! 当然,如果碰巧this 就是当前线程, 那也是没毛病的。

参考:

http://blog.csdn.net/yezis/article/details/57513130

https://stackoverflow.com/questions/2077216/java-thread-currentthread-sleepx-vs-thread-sleepx

关于 Thread.currentThread()的更多相关文章

  1. Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术

      package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...

  2. 关于Thread.currentThread()和this的差异

    重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: public class MyThread02 extends Thread { public MyThread02() { System.o ...

  3. ClassLoader,Thread.currentThread().setContextClassLoader,tomcat的ClassLoader

    实际上,在Java应用中所有程序都运行在线程里,如果在程序中没有手工设置过ClassLoader,对于一般的java类如下两种方法获得的ClassLoader通常都是同一个 this.getClass ...

  4. Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream

    Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Cl ...

  5. java 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

    查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup ...

  6. String.valueOf(Thread.currentThread().getContextClassLoader().getResource("")) 获取项目的绝对路径(shiro项目中来的八)

    一,上代码 String.valueOf(Thread.currentThread().getContextClassLoader().getResource("")) file: ...

  7. Not on FX application thread; currentThread = AWT-EventQueue-0的解决方法

    swing awt跑javafx报了这问题 Not on FX application thread; currentThread = AWT-EventQueue-0 解决方法 Platform.r ...

  8. Thread.currentThread()和this的区别——《Java多线程编程核心技术》

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

  9. Thread.currentThread().getContextClassLoader().getResourceAsStream

    Thread.currentThread().getContextClassLoader().getResourceAsStream 2014年04月02日 06:49:47 OkidoGreen 阅 ...

  10. 演示Thread.sleep(100)和Thread.currentThread().isInterrupted()+@Deprecated:将方法标注为废弃的方法

    package charpter08; public class TestInterrupt01 { public static void main(String[] args) { Processo ...

随机推荐

  1. AndroidStudio相关经验记录

    1.初次打开Gradle工程特别慢,一直提示下载更新Gradle 解决办法:打开Gradle工程子目录:“\gradle\wrapper” 下的 “gradle-wrapper.properties” ...

  2. 黄聪:PHP JSON_ENCODE 不转义中文汉字的方法

    ios程序中不识别读取到的JSON数据中 \u开头的数据. PHP 生成JSON的时候,必须将汉字不转义为 \u开头的UNICODE数据. 网上很多,但是其实都是错误的,正确的方法是在json_enc ...

  3. Java第01次实验提纲(基本概念+编程环境入门+PTA)

    0. 控制台下编译.运行 在Notepad++编写Java程序 学会使用控制台,javac.java 学会使用Notepad++ 参考资料: 控制台-cmd应用基础 扫盲教程 使用命令行编译并运行ja ...

  4. Ubuntu16.04 LTS软件中心闪退及修改阿里源

    现象: 进入软件中心点击任意,直接退出 解决办法: 先更换软件源,我的为阿里云 1. 备份 源位置 :/etc/apt/sources.list 2. 更改 sudo vi /etc/apt/sour ...

  5. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  6. ALGO-11_蓝桥杯_算法训练_瓷砖铺放(递归)

    问题描述 有一长度为N(<=N<=)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5 ...

  7. Android开发之Activity(cho1)篇

    一.Activity判断网络是否连通: 首先创建一个Andorid Project项目,然后添加一个on1类,Layout一个button控件和Textview控件. values有一个Color.x ...

  8. 廖雪峰Java5Java集合-5Queue-1使用Queue

    Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...

  9. python图片和字符串的转换

    有个业务,需要将图片压缩转化为64位编码上传到服务端. import json,requests,base64 #网上下载图片素材 r = requests.get("https://tim ...

  10. 第一天课程:第一个python程序print say hello

    print("Hello World") linux下要加可执行权限 chmod 755 hello.py 权限755,7=4+2+1,4是读,2是写,1是执行,第一个7代表用户, ...