如何在java中摆脱这种“静态方法应该以静态方式访问”?

时间:2011-10-03 22:17:33

标签: java multithreading concurrency sleep thread-sleep

我在java应用程序中有以下代码

Thread.currentThread().sleep(10000);

然而,eclipse向我显示以下警告:

The static method sleep(long) from the type Thread should be accessed in a static way

我很自豪永远不会发布带警告的代码,我想摆脱这个警告(它发生在两个不同的类中)。我是否需要发布整个代码?

5 个答案:

答案 0 :(得分:32)

你打电话

Thread.sleep(10000);

总是使当前线程休眠。即使你这样做了:

Thread t = new Thread(...);
t.start();
t.sleep(10000);

那将仍然使当前线程休眠10秒,同时让新线程继续快乐。这几乎是规范示例,说明为什么这个警告很重要 - 这是因为你正在调用静态方法,好像它是一个实例方法,这使它成为看起来就像你在调用它一样重要。它没有。甚至没有检查该值是否为null:

Thread t = null;
t.sleep(10000); // Still sleeps for 10 seconds...

(我很自豪地说,我最初在2002年6月在Eclipse中为此警告提交了feature request:)

答案 1 :(得分:3)

Thread.sleep(...)(Thread上的静态方法)。

  
    

使当前正在执行的线程暂停...

  

告诉另一个线程进入睡眠状态是没有意义的:将其设置为静态可确保此限制(尽管“只有警告”)。

帖子中的代码将编译,因为obj.sm 被编译器重写为T.sm,其中sm是类T上的静态方法和obj编译时类型T:因此它是静态方法调用并且实例方法(对于特定的线程),这是警告的内容。

快乐的编码。

答案 2 :(得分:3)

是的,当您查看doc for sleep()时,它会说“静态无效睡眠(long millis)”。由于通道中的噪声,“静态”不存在,这意味着该方法应该Thread.sleep(...)而不是someThreadObject.sleep(...)。作为一种“便利”,你可以使用后一种形式,但强烈建议不要这样做。

答案 3 :(得分:2)

要走的路是

Thread.sleep(10000);

有了这个意图,无论如何你只能自己睡觉。一个真正的非静态方法意味着,您也可以发送另一个正在休眠的线程。

答案 4 :(得分:2)

只需调用Thread.sleep(10000),就会导致当前线程进入休眠状态。 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#sleep(long