面试题:Java中sleep和wait方法的区别

摘要:介绍sleep方法和wait方法的相同点和区别。

  在学习JAVA多线程的时候,不少人会把函数sleep和wait搞混,傻傻分不清,简单粗暴地认为都是使得线程进入等待状态,比如就分不清方法sleep(long)和wait(long)。下面主要介绍sleep方法和wait方法的相同点和区别。

  关于sleep() 和 wait()方法的异同点是什么的问题,首先需要明白的是sleep()是Thread的静态本地方法,wait()是Object的成员方法,由此可知,二者是有本质区别的。

相同点

  • 一旦执行方法,都可以使得当前的线程进入等待状态。
  • 释放占用的CPU资源,使其它线程有机会获得执行权。
  • wait和sleep都可以被中断(interrupt)。

不同点

  1. 声明位置不同,sleep是声明在Thread类的静态方法,可以在任何线程中使用。wait是声明在Object类的成员方法,与对象的监视器锁相关,只能在同步代码块或同步方法中使用。
  2. 关于是否可以指定睡眠时间,sleep函数必须指定,wait可以指定也可以不指定。
  3. sleep(long millis) 会让当前正在运行的、占用CPU时间片的线程挂起指定时间,在休眠时间结束时自动苏醒进入可运行状态;切记,是不会由睡眠状态直接变为运行状态的。wait() 方法用来线程间通信,如果设置了时间,就等待指定时间;如果不设置,则该对象在其它线程被调用 notify() / notifyAll() 方法后进入可运行状态,才有机会竞争获取对象锁。
  4. 适用场景不同,sleep可以在任何需要的场景下调用,wait()必须在同步代码块或者同步方法的监视器中调用。
  5. 关于是否释放锁,sleep不会释放锁,线程睡着的时候,如果手里持有一把对象锁,那就一直抱着锁不松开,让其它线程无法得到这把锁,是一种贪婪的做法!wait素质很高,睡着的时候会释放锁,并进入线程等待池,以便其它线程可以获取该锁。
  6. sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
  7. 关于唤醒机制,sleep休眠之后退出阻塞,自动唤醒,不涉及线程间的通信;wait在被其它线程调用notify或notifyAll唤醒后,需要重新获取锁才能继续执行,常见于生产者-消费者问题中。

  “故不积跬步,无以至千里;不积小流,无以成江海。”

posted @   楼兰胡杨  阅读(886)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示