关于 Thread.currentThread()

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


26down vote

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

时间: 2024-10-03 14:24:57

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

Thread.currentThread()与this的区别

Thread.currentThread()与this的区别: 1.Thread.currentThread().getName()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引用. 2.使用范围: Thread.currentThread().getName()在两种实现线程的方式中都可以用.   this.getName()只能在继承方式中使用.因为在Thread子类中用this,this代表的是线程对象.   如果你在Runnable实现类中用

Java多线程之this与Thread.currentThread()的区别

package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.println("CountOperate---begin"); System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName());//获取线程名 System.ou

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

Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第二个参数(bool)表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量. C

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

重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: 1 public class MyThread02 extends Thread { 2 public MyThread02() { 3 System.out.println("init curr: " + Thread.currentThread().getName()); 4 System.out.println("init this: "+this.getName()); 5 } 6 @Override

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader().而我们后面的WEB程序,里面的jar.resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar.资源文件的时候,首先应该是使用Thread.currentThread

Thread.currentThread().getName() ,对象实例.getName() 和 this.getName()区别

首先要明白 this.XXX 的使用场景  使用Thread.currentThread().getName()和使用this.getName()和对象实例.getName(),都可以得到线程的名称,但是使用this调用getName()方法只能在本类中,而不能在其他类中,更不能在Runnable接口中,所以只能使用Thread.currentThread().getName()获取线程的名称,否则会出现编译时异常. Thread.currentThread().getName()  ,对象实例

关于Thread.currentThread().getName和this.getName()的问题

package mythread; public class CountOperate extends Thread{     public CountOperate(){         System.out.println("CountOperate---begin");         System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getNam

Thread.currentThread().getName() 和 this.getName()区别详解

Thread.currentThread().getName() 和 this.getName()区别详解 <<Java多线程编程核心技术>> 这本书里说到了这个:  Thread.currentThread().getName() this.getName() 他俩是有区别的,得到的效应是不一样的,首先,从直观上来说: Thread.currentThread().getName() 是一个静态方法 this.getName()是一个实例方法 实例方法,一般情况下是:反映这个实例

得到当前方法的名字Thread.currentThread().getStackTrace()[1].getMethodName();

得到当前方法的名字 String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组.如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组.如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用.最后一个元素代表堆栈底,是该序列中最旧的方法调用.getStackTrace()[0]表示的事getSt