Java中的wait()和sleep()方法的区别

在Java多线程开发中,等待-通知机制是一种非常普遍的线程间协作机制,对应到设计模式就是生产者消费者模式。该机制主要通过 wait() 和 notify()、notifyAll() 函数进行工作。其中wait()函数功能是将线程从工作状态进入等待状态;notify()和notifyAll()函数的功能是将线程从等待状态切换到工作状态。

notify()和notifyAll()函数的区别:

  • notify()函数是随机的唤醒等待对列中的一个线程。缺点是:可能会导致某一个线程无限期等待
  • notifyAll()函数是将等待对列中的所有线程全部唤醒
    推荐,在实际工作中尽量使用notifyAll()函数。

wait()和sleep()方法的区别

  1. wait 会释放线程得到的所有锁,sleep不会释放锁
  2. wait 只能在同步方法或者同步块中使用,sleep在任何地方都可以
  3. wait不需要捕捉异常,sleep需要
  4. wait需要被唤醒,sleep不需要
  5. wait是Object对象的方法,sleep是Thread对象的方法
  6. sleep方法调用

wait()方法与sleep()方法的不同之处在于,wait()方法会释放对象的“锁标志”。当调用某一对象的wait()方法后,会使当前线程暂停执行,并将当前线程放入对象等待池中,直到调用了notify()方法后,将从对象等待池中移出任意一个线程并放入锁标志等待池中,只有锁标志等待池中的线程可以获取锁标志,它们随时准备争夺锁的拥有权。当调用了某个对象的notifyAll()方法,会将对象等待池中的所有线程都移动到该对象的锁标志等待池。
sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。

发表评论

电子邮件地址不会被公开。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部