Java:Thread.currentThread()。sleep(x)vs. Thread.sleep(x)

时间:2010-01-16 11:45:41

标签: java eclipse multithreading sleep warnings

我的代码中有这个

Thread.currentThread().sleep(x);
Eclipse告诉我使用静态

Thread.sleep(x); 

相反,为什么?有什么区别,这两种方法之间的功能有什么不同吗?

4 个答案:

答案 0 :(得分:128)

只有一种方法,而不是两种方法,它是静态的。虽然您可以通过实例引用调用静态方法,但它并不是一种好的方式。它表明程序员认为他或她正在调用实例方法。一个困惑的程序员可能会认为他或她可以导致另一个线程(不是当前的线程)以这种方式睡觉,而这不是它的作用。

你的代码行都做同样的事情,但第二行是更好的风格。

答案 1 :(得分:30)

在Java中,sleep是一种静态方法。你的例子都做了完全相同的事情,但前一版本令人困惑,因为它看起来像是在特定对象上调用一个方法,但它根本就没有这样做。在你的例子中它并不重要,但如果你有以下内容则更危险:

someOtherThread.sleep(x);

这次看起来你正在告诉其他一些线程要睡觉,但实际上你正在把当前线程置于睡眠状态。避免犯这种错误的方法是始终使用类而不是特定对象调用静态方法。

答案 2 :(得分:3)

两个方法调用在行为上是相同的,因为它们调用相同的方法但是使用类名(在这种情况下为 Thread )而不是实例来访问静态字段和方法使得这个静态清除。这就是产生这种警告的原因。

但是考虑到静态字段和方法在大多数IDE中以特定方式显示(例如在Eclipse和IntelliJ IDEA中以斜体字体显示),这个警告仍然是必要的吗?也许没有像Java早期那样有必要使用简单的编辑器。

答案 3 :(得分:0)

Thread.currentThread().sleep(x);或者说 Eclipse 的方式如果需要那么Thread.sleep(x);静态上下文是必需的,所以我们坚持这个睡眠会有一点延迟。

由一个对象设置的静态范例,只影响特定对象堆打印生命周期,再次考虑整个对象生命周期静态不是那么麻烦,如果需要它可以用来简化编码,但要谨慎地做到静态足迹由Class(例如: - Class.forName(pkg.className))引用,就像名称一样,而不是object,它是{{1}中Class的运行时单打印副本记忆。

再次使用对象也有优点和缺点。弱者,幽灵,强烈的参考资料......,

代码被大自然所困扰。这就是我们如何做到这一点,以使其工作和功能