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


86

私は私のコードにこれを持っています

Thread.currentThread().sleep(x);

Eclipseは静的を使用するように指示します

Thread.sleep(x); 

代わりに、なぜですか?違いは何ですか、これら2つの方法の間で機能にまったく違いがありますか?


1
Eclipseには「保存アクション」があり、インスタンス変数を介した静的メンバーアクセスをクラス名を介した静的アクセスに自動的に置き換えます-この保存アクションと、同意する他の多くの保存アクションを有効にします(たとえば、不要なキャストの削除、不要「これ」など)。
les2 2010年

回答:


135

メソッドは2つではなく、1つだけであり、静的です。インスタンス参照を介して静的メソッドを呼び出すことはできますが、それは適切なスタイルではありません。これは、プログラマーがインスタンスメソッドを呼び出していると考えていることを示しています。混乱しているプログラマーは、別のスレッド(現在のスレッドではない)をこの方法でスリープさせることができると考えている可能性があります。

コードの両方の行は同じことを行いますが、2番目の行はより良いスタイルです。


24
プログラマーがsomeThread.sleep()を介して特定のスレッドをスリープ状態にしたい場合があることに言及することへの+1。
chii 2010年

32

Javaでは、スリープは静的メソッドです。どちらの例もまったく同じことをしますが、前のバージョンは特定のオブジェクトのメソッドを呼び出しているように見えますが、まったく実行していないため、混乱を招きます。あなたの例では、それはそれほど重要ではありませんが、次のものがある場合はより危険です。

someOtherThread.sleep(x);

今回は、他のスレッドにスリープを指示しているように見えますが、実際には、現在のスレッドをスリープ状態にしています。この種の間違いを避ける方法は、特定のオブジェクトではなく、クラスを使用して常に静的メソッドを呼び出すことです。


この1行の「someOtherThread.sleep(x);」の実行中に、currentThreadとsomeOtherThreadの両方がスリープ状態になるということですか。??
Kanagavelu Sugumar 2013年

3
いいえ。現在のスレッドは、どのThreadオブジェクト.sleepが呼び出されても、スリープ状態になります。他のスレッドをスリープ状態にすることはできません(そのように)。
トルク

3

2つのメソッド呼び出しは、同じメソッドを呼び出すため動作が同じですが、静的フィールドとメソッドにアクセスするためにインスタンスではなくクラス名(この場合はスレッド)を使用すると、この静的性が明確になります。そのため、この警告が生成されます。

しかし、静的フィールドとメソッドがほとんどのIDEで特定の方法で表示されることを考えると(たとえば、EclipseやIntelliJ IDEAのイタリックフォントで)、この警告はまだ必要ですか?単純なエディターが使用されていたのは、Javaの初期の頃ほど必要ではなかったのかもしれません。


0

Thread.currentThread().sleep(x);または、Eclipseが言うようThread.sleep(x);に、必要に応じて静的コンテキストが必要になるため、このスリープを少し遅らせます。

1つのオブジェクトによって設定された静的パラダイムは、その特定のオブジェクトヒープ印刷ライフサイクルにのみ影響します。オブジェクトライフサイクル全体の静的はそれほど面倒ではなく、必要に応じてコーディングを容易にするために使用できますが、静的フットとして慎重に行う必要があります。 printは、メモリ内のクラスの実行時の単一の印刷コピーであるものではなく、名前のようにClass(例:-)によって参照されます。Class.forName(pkg.className)objectHEAP

繰り返しますが、オブジェクトの使用法には、弱い、ファントム、強い種類の参照による長所と短所もあります....、

コードは自然によって複雑になっています。それは、それを機能させて機能させるための私たちのやり方です。


1
スレッドについて話すと、非同期で生成されますが、スレッドには同期的なものがあるかもしれません。本質的に、すべてのものは非同期ですが、いつか同期するものもあります。量子や天文学に侵入しても、同期するものはありません。
Dev Anand Sadasivam 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.