6

Javaアプリケーションに次のコードがあります

Thread.currentThread().sleep(10000);

しかし、日食は私に次の警告を示しています:

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

警告付きのコードをリリースしないことを非常に誇りに思っています。この警告を取り除きたいと思います(2つの異なるクラスで発生します)。コード全体を投稿する必要がありますか?

4

5 に答える 5

34

あなたが呼ぶ

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でこの警告の機能要求を提出したことを誇りに思います:)

于 2011-10-03T22:20:30.313 に答える
4

Thread.sleep(...)(スレッドの静的メソッド)。

現在実行中のスレッドをスリープ状態にします...

別のスレッドにスリープするように指示することは意味がありません。静的にすることで、この制限が保証されます(「警告がある場合のみ」ですが)。

ポストのコードは、コンパイラによってに書き換えられるため、コンパイルされます。ここで、はクラスの静的メソッドであり、コンパイル時のタイプは:です。したがって、呼び出されるのは静的メソッドであり、インスタンスメソッドではありません(特定の場合スレッド)、これは警告の内容です。obj.smT.smsmTobjT

ハッピーコーディング。

于 2011-10-03T22:20:41.193 に答える
3

うん、sleep()のドキュメントを見ると、「static voidsleep(longmillis)」と表示されています。チャネル内のノイズのために「静的」は存在しません。これは、のThread.sleep(...)代わりにメソッドをアドレス指定する必要があることを意味しますsomeThreadObject.sleep(...)。「便利」として後者の形式を使用できますが、強くお勧めしません。

于 2011-10-03T22:25:22.483 に答える
2

行く方法は

Thread.sleep(10000);

とにかく自分だけが眠りにつくことができるという意図で。実際の非静的メソッドは、スリープ状態の別のスレッドを送信できることを意味します。

于 2011-10-03T22:20:57.693 に答える
2

を呼び出すだけThread.sleep(10000)で、現在のスレッドがスリープ状態になります。http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#sleep(long

于 2011-10-03T22:21:37.850 に答える