zoukankan      html  css  js  c++  java
  • sleep()和wait()有什么区别?

    • sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法
    • sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    • sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
    • JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常

    测试代码

    public class TestWaitSleep {
     
        private static Object obj = new Object();
        
        public static void main(String[] args) {
            
            //测试sleep()
            //测试 RunnableImpl1 wait(); RunnableImpl2 notify()
            Thread t1 = new Thread(new RunnableImpl1(obj));
            Thread t2 = new Thread(new RunnableImpl2(obj));
            t1.start();
            t2.start();
            
            //测试RunnableImpl3 wait(long timeout)方法
            Thread t3 = new Thread(new RunnableImpl3(obj));
            t3.start();
        }
     
        
    }
     
    class RunnableImpl1 implements Runnable {
     
        private Object obj;
        
        public RunnableImpl1(Object obj) {
            this.obj = obj;
        }
        
        public void run() {
            System.out.println("run on RunnableImpl1");
            synchronized (obj) {
                System.out.println("obj to wait on RunnableImpl1");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("obj continue to run on RunnableImpl1");
            }
        }
    }
     
    class RunnableImpl2 implements Runnable {
     
        private Object obj;
        
        public RunnableImpl2(Object obj) {
            this.obj = obj;
        }
        
        public void run() {
            System.out.println("run on RunnableImpl2");
            System.out.println("睡眠3秒...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (obj) {
                System.out.println("notify obj on RunnableImpl2");
                obj.notify();
            }
        }
    }
     
    class RunnableImpl3 implements Runnable {
     
        private Object obj;
        
        public RunnableImpl3(Object obj) {
            this.obj = obj;
        }
        
        public void run() {
            System.out.println("run on RunnableImpl3");
            synchronized (obj) {
                System.out.println("obj to wait on RunnableImpl3");
                try {
                    obj.wait(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("obj continue to run on RunnableImpl3");
            }
        }
    }

    打印结果

    run on RunnableImpl2
    睡眠3秒...
    run on RunnableImpl1
    obj to wait on RunnableImpl1
    run on RunnableImpl3
    obj to wait on RunnableImpl3
    obj continue to run on RunnableImpl3
    notify obj on RunnableImpl2
    obj continue to run on RunnableImpl1


     


     

    所有资源资源汇总于公众号



     

  • 相关阅读:
    Linux内核设计与实现 总结笔记(第五章)系统调用
    Linux内核设计与实现 总结笔记(第四章)进程调度
    Linux内核设计与实现 总结笔记(第三章)进程
    Linux内核设计与实现 总结笔记(第二章)
    4412 移植x264并且YUV422转x264
    4412 使用usb摄像头拍照YUYV格式
    LDD3 第15章 内存映射和DMA
    LDD3 第13章 USB驱动程序
    ldd3 第12章 PCI驱动程序
    4412 移植mpu9250尝试
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/11993363.html
Copyright © 2011-2022 走看看