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


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

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

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

相同点: 一旦执行方法,都可以使得当前的线程进入等待状态。

不同点

  1. 声明的位置不同,sleep()声明在Thread 类,wait()声明在Object 类;
  2. 关于是否可以指定睡眠时间,sleep函数必须指定,wait可以指定也可以不指定;
  3. sleep() 会让当前正在运行的、占用CPU时间片的线程挂起指定时间,休眠时间到自动苏醒进入可运行状态;切记,是不会由睡眠状态直接变为运行状态的。wait() 方法用来线程间通信,如果设置了时间,就等待指定时间;如果不设置,则该对象在其它线程被调用 notify() / notifyAll() 方法后进入可运行状态,才有机会竞争获取对象锁。
  4. 适用场景不同,sleep()可以在任何需要的场景下调用,wait()必须在同步代码块中或者同步方法中的监视器中。
  5. 关于是否释放同步监视器,如果两方法都是使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁,并进入线程等待池。
  6. sleep()线程控制自身流程。wait()用来线程间通信,使拥有该对象锁的线程等待直到指定时间或notify()。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM