Javaのsleep()とwait()の違い

2914 ワード

sleep()メソッドについては,まずこのメソッドがThreadクラスに属することを知る.wait()メソッドはObjectクラスに属する.
sleep()メソッドにより、プログラムは指定された時間の実行を一時停止し、cpuを他のスレッドから解放したが、彼の監視状態は依然として保持者であり、指定された時間になると自動的に運転状態を回復する.
sleep()メソッドを呼び出すと、スレッドはオブジェクトロックを解放しません.
一方、wait()メソッドを呼び出すと、スレッドはオブジェクトロックを放棄し、このオブジェクトを待つ待機ロックプールに入ります.このオブジェクトに対してnotify()メソッドを呼び出すと、このスレッドはオブジェクトロックプールの準備に入ります.
オブジェクトロックを取得して実行状態にします.
どういう意味ですか.
列の子を挙げて説明します.
/**
 * 
 */
package com.b510.test;

/**
 * java  sleep() wait()   
 */
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!!!

コメントが削除された場合:
 TestD.class.notify();

実行効果:
enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!

プログラムは常に保留中です.