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


86

我的代码中有这个

Thread.currentThread().sleep(x);

Eclipse告诉我使用静态

Thread.sleep(x); 

相反,为什么呢?有什么区别,这两种方法之间的功能是否完全不同?


1
Eclipse中有一个“保存操作”,它将通过实例变量自动替换通过实例变量进行的静态成员访问(通过类名进行静态访问)-启用此保存操作以及您同意的其他许多保存操作(例如,删除不必要的强制转换, “此”等)。
les2 2010年

Answers:


135

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

您的两行代码都做同样的事情,但第二行是更好的样式。


24
+1表示程序员可能想通过someThread.sleep()使特定线程进入睡眠状态,而事实并非如此。
CHII

32

在Java中,睡眠是一种静态方法。您的两个示例都做完全相同的事情,但是前一个版本令人困惑,因为它看起来像是在特定对象上调用方法,但根本没有这样做。在您的示例中,这无关紧要,但是如果您具有以下条件,则将更加危险:

someOtherThread.sleep(x);

这次看起来您正在告诉其他线程进入睡眠状态,但实际上您正在使当前线程进入睡眠状态。避免发生此类错误的方法是始终使用类而不是特定对象来调用静态方法。


您是说在执行这一行“ someOtherThread.sleep(x);”时,currentThread和someOtherThread都将进入睡眠状态吗???
卡纳加维卢·苏古玛

3
否。无论调用什么线程对象.sleep,当前线程都将进入睡眠状态。您不能让其他线程入睡(那样)。
扭矩

3

这两个方法调用在行为上是相同的,因为它们调用相同的方法,但是使用类名(在本例中为Thread)而不是实例来访问静态字段,并且方法使这种静态性清晰可见。这就是产生此警告的原因。

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


0

Thread.currentThread().sleep(x);还是Eclipse所说的Thread.sleep(x);需要静态上下文的方式,因此我们在睡眠中会稍有延迟。

由一个对象设置的静态范式仅影响特定的对象堆打印生命周期,再次考虑到整个“对象生命周期”并不那么麻烦,如果需要,可以将其用于简化编码,但请谨慎地做为静态脚位。 print由Class(例如Class.forName(pkg.className):-)像按名称一样引用,而不是由内存object中Class的运行时单个打印副本引用HEAP

再次,对象的使用在Weak,Phantom,Strong类引用中也有优缺点....,

代码是自然界的难题。这就是我们如何使其正常工作和起作用的方法。


1
谈论线程,它是异步产生的,尽管我们在线程中可能有同步的东西。从本质上来说,所有事物都是异步的,尽管我们有时发现事物是同步的。即使我们侵入量子或天文学,也没有任何事情是同步的。
Dev Anand Sadasivam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.