专注JavaWeb开发 首页制式『默认式 OR 时间轴 网站地图|RSS订阅|设为首页|加入收藏
当前位置:首页 >Java >Java基础 > 正文

Java多线程之yield() sleep() wait()区别详解

来源: Java技术聚合网 作者: 你才是码农 发布时间: 2015-03-25 浏览次数:

在java多线程学习中,经常会遇到这三个方法,yield(),sleep(),wait(),对于初学多线程的我来说,开始不太容易记住这几个方法的之间的区别于联系,经过搜集不同的资料,将这三个方法总结一下,记录学习java多线程的点滴。

1.sleep()

使当前线程暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。同时该方法要捕捉InterruptedException异常。会使当前处于运行状态的线程放弃CPU,把把运行机会让给别的线程,不考虑其他线程的优先级,因此会给较低优先级线程一个运行的机会。

2.yield()

    先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。同时,yield()也不会释放锁标志。

注意:调用yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会,并不能保证同优先级的线程一定能执行,仅仅是建议,没有任何机制保证你这个建议会被采纳。一般情况下,对于任何重要的控制或者调用应用时,都不能依赖于yield()。

3.wait()

    线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()或notifyAll()唤醒该线程,才能继续获取对象锁,并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。


QQ群: 武汉地区(142173356)验证消息JavaWeb1024

网友共有【】评论,点击查看


相关新闻:


x 微信关注我们 随时获取最新网站资讯