• Java sleep()和wait()的区别


    一、什么是sleep()?

      sleep()是Thread类的方法,导致线程暂停执行的时间,给其他线程执行机会,但是依然保持监控状态,过了指定时间会自动恢复执行,调用sleep()方法不会释放锁对象。

    当调用sleep()方法后,当前线程进入阻塞状态。目的是让出cpu给其他线程运行的机会。但是由于sleep方法不会释放锁对象,所以在一个同步代码块中调用这个方法后,线程虽然休眠了,但其他线程无法访问他的锁对象。这是因为sleep方法拥有cpu的执行权,他可以自动醒来无需唤醒。而当sleep结束指定休眠时间后,这个线程不一定立即执行,因为此时其他线程可能正在运行。

    二、什么是wait()?

      wait方法是object类里的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的线程池中,同时释放了锁对象,等待期间可以调用里面的同步方法,其他线程可以访问,等待时不拥有cpu的执行权,否则其他线程无法获取执行权。当一个线程执行了wait方法后,必须调用notify或者notifyAll方法才能唤醒,而且是随机唤醒,若是被其他线程抢到了cpu执行权,该线程会继续进入等待状态。由于锁对象可以是任意对象,所以wait方法必须定义在Object类中,因为Object类是所有类的基类。

    三、总结sleep()和wait()的区别

      1.sleep()是Thread类中的静态方法,wait()是Object超类中定义的成员方法,因此sleep()可以在任何地方使用,而wait()只能在同步方法或者同步代码块中使用。

      2.sleep()方法必须传一个时间参数,而wait()可传可不传

      3.sleep()方法导致了程序暂停执行的时间,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

    而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有支队此对象调用notify()方法后本线程才进入对象锁定池准备。

       4.sleep()方法需要抛出异常,wait方法不需要,why?

    因为Thread类中的sleep()方法就已经进行了抛异常处理。

  • 相关阅读:
    CountDownLatch, CyclicBarrier, Semaphore
    工具类中使用@Autowired失败问题
    可重入锁(递归锁)
    读写锁
    自旋锁
    加入BLOG
    控制字符串的超长部分用省略号表示
    java常见面试题总结
    maven打包不运行test脚本的命令
    DataGrip使用教程
  • 原文地址:https://www.cnblogs.com/l199616j/p/11576796.html
Copyright © 2020-2023  润新知