Javaにおけるwait()とsleep()の違い

2124 ワード

基本的な違い:1.wait()はObjectクラスで定義されたメソッドであり、sleep()はThreadクラスで定義されたメソッド2.sleep()メソッドはどこでも使用できます.wait()はsynchronizedメソッドまたはsynchronizedコードブロックでのみ使用できます.ロックを解放するため、ロックを解放する前にロックを取得する必要があります.
本質的な違い:thread.sleep()はCPUを解放しますが、オブジェクトロックobject.wait()はCPUを解放しません.また、オブジェクトロックも解放します.
public class Test {
    public static void main(String[] args) {
        final Object lock = new Object();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread A  is waiting to get lock");
                synchronized (lock){
                    System.out.println("thread A get lock ");
                    try {
                        Thread.sleep(20);
                        System.out.println("Thread A  do wait method");
                        lock.wait(1000);
                        System.out.println("Thread A is done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread B  is waiting to get lock");
                synchronized (lock){
                    System.out.println("thread B get lock ");
                    try {
                        Thread.sleep(10);
                        System.out.println("Thread B  do wait method");
                        System.out.println("Thread B is done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

      :
thread A  is waiting to get lock
thread A get lock 
thread B  is waiting to get lock
Thread A  do wait method
thread B get lock 
Thread B  do wait method
Thread B is done
Thread A is done