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() の場合、出力結果は次のようになります。
threadTest.wait2Seconds() の場合、出力結果は次のようになります。
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() によって解放されたため)、出力は次のようになります: 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の待機とスリープの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。number+100;