Java中wait、sleep和yield的区别

Java中wait、sleep的区别或者Java中sleep、yield的区别是Java面试或者多线程面试中最常问的问题之一。首先,一个最明显的区别是:wait是Object类的方法,sleep和yield是Thread类的静态方法

本质上,wait方法是用来让线程等待某个条件,进入该条件的等待集中。而sleep和yield方法是用来让线程让出CPU时间,把CPU交给线程调度器,使得其他线程能获得CPU时间。

接下来详细比较三个方法。

wait

常用的wait方法有wait( )wait(long timeout)

wait( )方法导致当前线程进入等待状态直到它被通知(其他线程调用notify或notifyAll方法。notify/notifyAll方法解除等待线程的阻塞状态)。

wait(long timeout) 方法导致当前线程进入等待状态直到它被通知或者经过指定的时间。

wait( )后,线程会释放掉它所占有的对象的锁,从而使线程所在对象中的其它synchronized数据可被别的线程使用。

wait方法只能在一个同步方法中调用。如果当前线程不是对象锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

sleep

Thread.sleep(long millis),必须带有一个时间参数

sleep(long millis)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行

sleep(long millis)可能使任意优先级的其他线程得到执行机会。

sleep(long millis)不会释放锁

调用sleep方法的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU

yield

yield方法没有参数

yield方法使当前线程让出CPU,但让出的时间是不可设定的

yield方法也不会释放锁

yield只能把CPU让给相同优先级的其他线程,而不会把CPU给更高或更低优先级的其他线程。若此时没有其他线程跟它在有一个优先级,则该线程继续获得CPU时间,因此可能某线程刚调用yield方法又马上被执行

微信公众号:FullStackPlan

扫一扫可以关注微信公众号哦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 12,078评论 3 87
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,206评论 1 15
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 10,253评论 12 45
  • 1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。...
    tdeblog阅读 3,446评论 0 1
  • 渐渐忙起来了,是我期待的,也是我担心的。对于我的生活来说,不确定是占多数的,而可以确定的我是个闲不住的人。 闲不住...
    博峰庸者阅读 3,846评论 2 49

友情链接更多精彩内容