Object的wait和Thread的sleep

Object的wait()

wait()搭配notify(),nofityAll()使用。
线程获取到对象锁之后,执行wait()就会释放对象锁,同时线程挂起,直到其他线程获取到对象锁并执行notify()后,线程重新开始运行。

final static Object async = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (async) {
                    System.out.println("thread a get async");
                    try {
                        System.out.println("thread a start wait");
                        async.wait();
                        System.out.println("thread a end wait");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (async){
                    System.out.println("thread b get async");
                    System.out.println("thread b notify async");
                    async.notify();
                }
            }
        }).start();
    }

输出:

thread a get async
thread a start wait
thread b get async
thread b notify async
thread a end wait

Thread.sleep()

线程获取到对象锁之后,sleep时不会释放对象锁,其他线程也不能获取到对象锁。直到线程sleep结束,其他线程才能获取到对象锁。

final static Object async = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (async) {
                    System.out.println("thread a get async");
                    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 (async) {
                    System.out.println("thread b get async");
                    System.out.println("thread b notify async");
                    async.notify();
                }
            }
        }).start();
    }

输出:

thread a get async
thread a start sleep
thread a end sleep
thread b get async
thread b notify async
posted @ 2017-08-03 21:45  just_yang  阅读(357)  评论(0编辑  收藏  举报