ホームページ  >  記事  >  Java  >  Javaの待機とスリープの違いは何ですか

Javaの待機とスリープの違いは何ですか

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-12-27 15:15:303510ブラウズ

Javaの待機とスリープの違いは何ですか

Javaの待機とスリープの違いは何ですか

sleep() メソッドと wait() メソッドの最大の違いは次のとおりです。

·sleep() がスリープすると、オブジェクトのロックは維持され、ロックは占有されたままになります;

wait() がスリープすると、オブジェクトはロックが解除されます。

ただし、wait() と sleep() は両方とも、interrupt() メソッドを通じてスレッドの一時停止状態に割り込み、スレッドが即座に InterruptedException をスローする可能性があります。 (ただし、この方法はお勧めしません)。

/**
 * Created by jiankunking on 2018/4/5.
 */
public class ThreadTest implements Runnable {
    int number = 10;
    public void addHundred() throws Exception {
        System.out.println("addHundred  begin");
        synchronized (this) {
            number += 100;
            System.out.println("addHundred:" + number);
        }
        System.out.println("addHundred  end");
    }
    public void wait2Seconds() throws Exception {
        System.out.println("wait2Seconds begin ");
        synchronized (this) {
            /**
             * (休息2S,阻塞线程)
             * 以验证当前线程对象的机锁被占用时,
             * 是否被可以访问其他同步代码块
             */
            System.out.println(".............wait begin..................");
            this.wait(2000);
            number *= 200;
            System.out.println(".............wait end..................");
        }
        System.out.println("wait2Seconds end ");
    }
    public void sleep2Seconds() throws Exception {
        System.out.println("sleep2Seconds begin ");
        synchronized (this) {
            /**
             * (休息2S,阻塞线程)
             * 以验证当前线程对象的机锁被占用时,
             * 是否被可以访问其他同步代码块
             */
            System.out.println("............sleep begin...................");
            Thread.sleep(2000);
            number *= 200;
            System.out.println(".............sleep end..................");
        }
        System.out.println("sleep2Seconds end ");
    }
    @Override
    public void run() {
        try {
            addHundred();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        //threadTest.sleep2Seconds();
        //threadTest.wait2Seconds();
    }
}

threadTest.sleep2Seconds() の場合、出力結果は次のようになります。 Javaの待機とスリープの違いは何ですか

threadTest.wait2Seconds() の場合、出力結果は次のようになります。 Javaの待機とスリープの違いは何ですか

sleep2Seconds()/wait2Seconds() は SecondMethod() で表されます:

このコードを簡単に分析してみましょう。main() メソッドで ThreadTest をインスタンス化し、スレッドを開始し、そのスレッドのメソッド (secondMethod()) を呼び出します。このメソッドはメインスレッドで呼び出されるため、呼び出された通常のメソッド SecondMethod() が最初に実行されます (ただし、これはスレッドのスレッド メソッドではありません)。通常メソッドの実行を終了するオブジェクト。実行時、通常メソッドの実行中、スレッドのメソッドも実行されます。メインスレッドの通常メソッドが最初に実行されることを除いて、交互に実行されます。プログラムが実行中です。 SecondMethod() が最初に実行され、 SecondMethod () メソッド コード フラグメントに同期されたブロックがあるため、 SecondMethod メソッドが実行された後、メソッドはオブジェクトのマシン ロックを占有し、オブジェクトのスレッド メソッドがブロックされ、 SecondeMethod がロックを解放するまで実行できません。

Thread.sleep(2000) メソッドを使用する場合、sleep はスレッドをブロックし、オブジェクト ロックを保持するため、そのメソッドの他の同期スレッド (secondMethod())オブジェクトは、同期ブロックが実行される (スリープが完了する) まで実行できませんが、 SecondMethod() メソッドは実行できるため、出力結果は次のようになります。

number*200+100;

this.wait(2000) メソッドを使用する場合、 SecondMethod () メソッドも実行後にオブジェクトのマシンロックをロックし、この .wait(2000) まで実行すると、メソッドは 2S 間スリープし、現在保持されているロックを解放します。このとき、スレッドの同期方法は次のようになります。 (secondMethod によって保持されていたロックが wait() によって解放されたため)、出力は次のようになります:

number+100;

Java の sleep メソッドについて注意すべき点がいくつかあります:

1. Thread.sleep() メソッドは、スレッドの実行を一時停止し、CPU をスレッド スケジューラに割り当てるために使用されます。

2. Thread.sleep() メソッドは静的メソッドで、現在実行中のスレッドを一時停止します。

3. Java には 2 つのスリープ メソッドがあり、1 つはミリ秒のパラメーターを 1 つだけ持ち、もう 1 つはミリ秒とナノ秒の 2 つのパラメーターを持ちます。

4. wait メソッドとは異なり、sleep メソッドはロックを解放しません。

5. 別のスレッドがスリープ中のスレッドに割り込むと、スリープ メソッドは割り込み例外をスローします。

6. 休止状態のスレッドは、復帰後に CPU を取得できるとは限りません。最初に準備完了状態になり、CPU をめぐって他のスレッドと競合します。

7. エラーが発生しやすい箇所があり、t.sleep() を呼び出すとスレッド t が一時停止されます。 Thread.sleep はスレッド t ではなく現在のスレッドをスリープ状態にする静的メソッドであるため、これは誤りです。

8. wait メソッドは、同期メソッドや同期コード ブロックなどの同期環境で使用する必要があります。同期状態で使用しない場合は、IllegalMonitorStateException がスローされます。また、同期条件下では sleep メソッドを呼び出す必要はなく、通常どおり使用できます。

9. wait メソッドは Object クラスで使用および定義されますが、sleep メソッドは現在のスレッドで動作し、java.lang.Thread クラスで定義されます。 PHP 中国語 Web サイトには、無料の

JAVA 入門チュートリアル ### が多数あり、誰でも学習することができます。 ###

以上がJavaの待機とスリープの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。