ホームページ  >  記事  >  Java  >  Javaのsleep()とwait()の違いを詳しく解説

Javaのsleep()とwait()の違いを詳しく解説

黄舟
黄舟オリジナル
2017-09-21 09:28:091554ブラウズ

この記事では、Java の sleep() と wait() の違いを説明する関連情報を中心に紹介します。この記事が必要な方の参考になれば幸いです

Java の sleep() と wait() の詳細な説明。 () の違い

sleep() メソッドの場合、まずこのメソッドが Thread クラスに属していることを知る必要があります。 wait() メソッドは Object クラスに属します。

sleep() メソッドは、指定された時間プログラムの実行を一時停止し、CPU を他のスレッドに明け渡しますが、その監視ステータスは残ります。指定された時間が経過すると、プログラムは自動的に実行を再開します。

sleep() メソッドを呼び出すプロセス中、スレッドはオブジェクトのロックを解放しません。

wait() メソッドが呼び出されると、スレッドはオブジェクト ロックを放棄し、このオブジェクトを待機している待機ロック プールに入ります。このオブジェクトの Notice() メソッドを呼び出した後でのみ、スレッドはオブジェクト ロック プールに入ります。オブジェクトのロックを取得する準備をします。実行状態に入ります。

どういう意味ですか?

説明する例:

/**
 * 
 */
package com.b510.test;

/**
 * java中的sleep()和wait()的区别
 * @author Hongten Java学习交流QQ群:589809992 我们一起学Java!
 * @date 2013-12-10
 */
public class TestD {

  public static void main(String[] args) {
    new Thread(new Thread1()).start();
    try {
      Thread.sleep(5000);
    } catch (Exception e) {
      e.printStackTrace();
    }
    new Thread(new Thread2()).start();
  }

  private static class Thread1 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
      System.out.println("enter thread1...");  
      System.out.println("thread1 is waiting...");
      try {
        //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
        TestD.class.wait();
      } catch (Exception e) {
        e.printStackTrace();
      }
      System.out.println("thread1 is going on ....");
      System.out.println("thread1 is over!!!");
      }
    }
  }

  private static class Thread2 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
        System.out.println("enter thread2....");
        System.out.println("thread2 is sleep....");
        //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
        TestD.class.notify();
        //==================
        //区别
        //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()
        //方法,则线程永远处于挂起状态。
        try {
          //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
          //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
          //在调用sleep()方法的过程中,线程不会释放对象锁。
          Thread.sleep(5000);
        } catch (Exception e) {
          e.printStackTrace();
        }
        System.out.println("thread2 is going on....");
        System.out.println("thread2 is over!!!");
      }
    }
  }
}

実行中のエフェクト:

enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!

コードをコメントアウトした場合:

1 TestD.class.notify();

実行中のエフェクト:

enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!

そしてプログラムは常に保留状態になります。

以上がJavaのsleep()とwait()の違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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