Java: Thread.currentThread().sleep(x) vs. Thread.sleep(x) Java中:Thread.currentThread().sleep(x)和Thread.sleep(x)有何区别?

94

我的代码中有这段内容

Thread.currentThread().sleep(x);

Eclipse提示我使用静态方法

Thread.sleep(x); 

那么,为什么要使用 instead?这两种方法之间有何区别?它们的功能是否存在任何差异?


1
在Eclipse中有一个“保存操作”,它会自动将通过实例变量访问静态成员的访问方式替换为通过类名进行静态访问 - 启用此保存操作以及您同意的其他保存操作(例如,删除不必要的转换,不必要的“this”等)。 - les2
4个回答

145

只有一个方法而不是两个,它是静态的。虽然您可以通过实例引用调用静态方法,但这不是好的编程风格。这表明程序员认为自己正在调用一个实例方法。混淆的程序员可能会认为以这种方式可以使另一个线程(而非当前线程)休眠,但事实并非如此。

您的两行代码做相同的事情,但第二种方式更好。


30
+1 提到程序员可能希望通过 someThread.sleep() 使特定线程休眠,但它并没有这样做。 - Chii

33
在Java中,sleep是一个静态方法。你的两个示例都执行相同的操作,但前一个版本很令人困惑,因为它看起来像是在调用特定对象的方法,但实际上并不是如此。在你的示例中,这并不重要,但如果你有以下情况,则会更加危险。
someOtherThread.sleep(x);

这次看起来像是在让另一个线程睡眠,但实际上是让当前线程睡眠。避免此类错误的方法是始终使用类而不是特定对象调用静态方法。


你的意思是在执行这一行代码 "someOtherThread.sleep(x);" 时,currentThread 和 someOtherThread 都会进入睡眠状态吗? - Kanagavelu Sugumar
3
不可以。无论Thread.sleep()被调用在哪个Thread对象上,当前的线程都会进入睡眠状态。你不能让其他线程(像那样)睡眠。 - Torque

3
这两个方法调用的行为是相同的,因为它们调用了同一个方法,但使用类名(在这种情况下是Thread)而不是实例来访问静态字段和方法,这使得静态性质更加清晰。这就是为什么会产生这个警告的原因。
但考虑到大多数IDE中以特定的方式显示静态字段和方法(例如在Eclipse和IntelliJ IDEA中以斜体字体显示),这个警告是否仍然必要呢?也许不像Java早期使用简单编辑器时那样必要了。

0

Thread.currentThread().sleep(x); 或者 Eclipse 所说的方式 Thread.sleep(x); 需要静态上下文,因此使用这个睡眠函数会有轻微延迟。

静态范式由一个对象设置,只影响该特定对象的堆打印生命周期,考虑整个对象生命周期时,静态不会那么麻烦,如果需要,可以用它来简化编码,但是要小心,因为静态占用的空间被类(例如:-Class.forName(pkg.className))所引用,就像按名称而不是按任何单次运行时副本的object在堆内存中的类。

再次,对象的使用也有弱、幻象、强引用的利弊。

代码具有复杂性。这只是我们为了让它能够工作和实用而做的事情。


1
谈到线程,它是异步生成的,尽管我们在线程中可能有同步的事情。从本质上讲,所有事情都是异步的,尽管我们有时会发现一些同步的事情。即使我们介入量子或天文学,也没有任何事情是同步的。 - Dev Anand Sadasivam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接