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

Java:Thread.currentThread().sleep(x)与Thread.sleep(x),java,eclipse,multithreading,sleep,warnings,Java,Eclipse,Multithreading,Sleep,Warnings,我的密码里有这个 Thread.currentThread().sleep(x); Eclipse告诉我使用静态 Thread.sleep(x); 相反,为什么?有什么区别,这两种方法在功能上有什么区别吗?只有一种方法,而不是两种,它是静态的。虽然可以通过实例引用调用静态方法,但这不是一种好的样式。它表示程序员认为他或她正在调用实例方法。一个困惑的程序员可能会认为他或她可以导致另一个线程(而不是当前线程)以这种方式休眠,而事实并非如此 您的两行代码都做相同的事情,但第二行的风格更好。在Ja

我的密码里有这个

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

Thread.sleep(x); 

相反,为什么?有什么区别,这两种方法在功能上有什么区别吗?

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


您的两行代码都做相同的事情,但第二行的风格更好。

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

someOtherThread.sleep(x);

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

这两个方法调用的行为相同,因为它们调用相同的方法,但使用类名(本例中为线程)而不是访问静态字段和方法的实例,使这种静态特性更加清晰。这就是产生这一警告的原因

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

Thread.currentThread().sleep(x)
或者Eclipse这样说
Thread.sleep(x)静态上下文,因此我们在这个睡眠中稍有延迟

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

同样地,对象的使用也有其优点和缺点,比如弱的、幻象的、强的引用


代码本质上是复杂的。这就是我们如何使其工作和功能化的方法。

+1提到程序员可能希望通过someThread.sleep()使特定线程休眠Eclipse中有一个“保存操作”,它会自动将通过实例变量访问的静态成员替换为通过类名访问的静态成员-启用此保存操作和您同意的其他保存操作(例如,删除不必要的强制转换、不必要的“this”等).您的意思是,当执行这一行“someOtherThread.sleep(x);”时,currentThread和someOtherThread都将进入睡眠状态吗?否。当前线程将进入睡眠状态,无论调用了哪个线程对象。睡眠状态。您不能将其他线程置于睡眠状态(如那样).说到线程,-它是异步产生的,尽管我们在线程中可能有同步的东西。从本质上来说,所有的东西都是异步的,尽管我们有时会发现同步的东西。即使我们入侵量子或天文学,这些东西都不是同步的。