Object.wait()与Thread.sleep()的区别
Object.wait()方法
Object.wait()与Object.notify(),Object.nofityAll()需要搭配使用,协作线程之间的通信。
线程获取到对象锁后,当它调用锁的wait()方法,就会释放对象锁,同时线程挂起,直到其他线程获取到对象锁并执行notify()后,线程重新开始运行。
示例
final static Object lock = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread a get lock");
                    try {
                        System.out.println("thread a start wait");
                        lock.wait();
                        System.out.println("thread a end wait");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    System.out.println("thread b get lock");
                    System.out.println("thread b notify lock");
                    lock.notify();
                }
            }
        }).start();
    }输出:
thread a get lock
thread a start wait
thread b get lock
thread b notify lock
thread a end waitThread.sleep()方法
线程获取到对象锁之后,调用Thread.sleep()时不会释放线程所占有的对象锁,其他线程也不能获取被此线程占用对象锁。直到线程sleep结束,其他线程才能获取到对象锁。
示例
final static Object lock = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread a get lock");
                    try {
                        System.out.println("thread a start sleep");
                        Thread.sleep(1000);
                        System.out.println("thread a end sleep");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread b get lock");
                    System.out.println("thread b notify lock");
                    lock.notify();
                }
            }
        }).start();
    }输出:
thread a get lock
thread a start sleep
thread a end sleep
thread b get lock
thread b notify lock 
             
             
             
             
            