说说wait()和sleep()的区别

wait()和sleep()的区别

  • sleep是Thread类的方法,wait是Object类中定义的的方法
  • sleep()方法可以被使用在任何地方,wait()方法只能在synchronized方法或synchronized块中使用
  • Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”
  • sleep()方法会让出CPU,但是不会释放锁资源
  • wait()方法不仅会让出CPU,还会释放锁资源

wait()和sleep()的方法运用示例,加深理解

public class TestMain {
    public static void main(String[] args) throws Exception {
        final Object lock = new Object();
        //线程一
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程一准备获取锁,进入同步块");
                synchronized (lock) {
                    System.out.println("线程一获取到了锁,开始执行");
                    try {
                        lock.wait(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("线程一执行完成");

                }
            }
        }).start();
        //睡眠一秒,让线程一能先执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //线程二
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程二准备获取锁,进入同步块");
                synchronized (lock) {
                    System.out.println("线程二获取到了锁,开始执行");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("一秒后,线程二执行完成");
                }
            }
        }).start();
        //睡眠一秒,让线程二能先执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //线程三
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程三准备获取锁,进入同步块");
                synchronized (lock) {
                    System.out.println("线程三获取到了锁,开始执行");
                    System.out.println("线程三执行完成");
                }
            }
        }).start();
    }
}

运行结果如下:
在这里插入图片描述

总结

从运行结果可以看出,由于线程一调用了wait()方法,会释放了锁,所以无需等待线程一执行完,线程二就能开始执行了。而由于线程二调用的是sleep()方法,不会释放锁资源,所以线程三需要等待线程二执行完成才能执行。
所以sleep()这个方法会让出CPU,但是不会释放锁资源,而wait()这个方法不仅会让出CPU,还会释放锁资源。

发布了178 篇原创文章 · 获赞 180 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104333335