0

私は教科書のいくつかの例に取り組んでおり、Eclipse でコードを書いてそれを理解しています。

これは、質問があるメソッドのコードです。

public void run() {
    //Get the lock before entering the loop
    synchronized(getClass()) {
        for (int i =0; i<N; i++) {
            System.out.println(getName() + " is tired");
            
            try{
                Thread.currentThread().sleep(DELAY);
            } catch (InterruptedException e) {}
            
            System.out.println(getName() + " is rested");
        }

オンラインで次のように入力します。

Thread.currentThread().sleep(DELAY)

Eclipse は次のような警告を表示します。Eclipse は次の解決策を提案します。

Thread.currentThread();
Thread.sleep(DELAY);

なぜ違いが生じるのかわかりません(実際に違いがある場合)。誰か説明してくれませんか?

4

9 に答える 9

9

sleep()静的メソッドであり、現在のスレッドを指定された時間だけスリープさせます。したがって、呼び出しは不必要であり、同様のコードを使用して別のスレッドをスリープ状態にすることができる (できない) ことをcurrentThread()ほとんど暗示しているため、混乱を招く可能性があります。

そのコードを記述する最良の方法は、次のとおりです。

Thread.sleep(DELAY);
于 2012-05-09T11:00:38.657 に答える
3

問題のコードは、スレッドとは何の関係もありません。sleepEclipse は、インスタンス経由ではなく、クラス名経由で静的メソッドに直接アクセスする必要があると言っているだけですThread.sleep(DELAY)

明確さ (および簡潔さ) のためstatic ... f()に、クラスの静的メソッドにCアクセスする必要があります。C.f()

于 2012-05-09T11:01:55.563 に答える
2

Thread.sleep() はすでに静的メソッドであり、現在のスレッドに影響を与えます。currentThread() を呼び出す必要はありません。

于 2012-05-09T11:01:54.753 に答える
1

私が間違っている場合は訂正してください。ただし、警告はおそらく「静的メソッド...は静的な方法でアクセスする必要があります」です(...は非静的な方法でアクセスする必要があります)。

実際、呼び出すのは混乱します

someThread.sleep(1000)

Thread.sleep()は静的メソッドであるため、someThreadに対してではなく、現在のThreadで呼び出されます。

したがって、メッセージには「静的な方法で静的メソッドにアクセスする」と書かれています:)

于 2012-05-09T11:15:06.180 に答える
1

Thread.delayは静的メソッドです。インスタンスを呼び出す必要はありません。Thread.delay()と言うだけです。

Thread.currentThread()は、現在のスレッドへの参照を返します。静的メソッドを呼び出すことはできますが、厳密には参照は必要なく、まったく使用されません。あなたは同様にこれを行うことができます:

new Thread().delay(100);

...そしてそれでも現在のスレッドをスリープ状態にします-作成したばかりのスレッドではありません。

したがって、Eclipseは、Thread.delay(100)が、より適切で混乱の少ない方法であることを示しています。

于 2012-05-09T11:03:46.953 に答える
0

実行に違いはありません。ただし、2 番目のオプション Thread.sleep() は、ユーザーがインスタンス メソッドであると考えて混乱しないため、より読みやすくなっています。

于 2012-05-09T11:00:53.590 に答える
0

Thread.currentThread().sleep()混乱を避けるために、インスタンス メソッドであるという印象を与えるメソッドにアクセスすることにより、Eclipse は、所有者クラスを介して静的メソッドにアクセスすることを提案します。これにより、それらが実際に静的であることを明らかにします。

于 2012-05-09T11:02:39.873 に答える
0

Victor Sorokin が書いたように、この警告は Threads を使用したサンプル コードとは関係ありません。次に、Eclipse で同じコンパイラ警告が表示される別の例を示します。

OptionBuilder.withArgName(PROPERTY_ARG).hasArg(true).isRequired(false).create(PROPERTY_ARG_OPTION);

これは、Apache Commons CLI ライブラリを使用しています。OptionBuilder は「流れるような」ビルダー パターンを使用します。警告を修正する唯一の方法は、行を複数のステートメントに分割する推奨の Eclipse ヒントを使用するか、警告を無視するように注釈を追加することです。

于 2014-02-14T01:32:23.240 に答える