A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙地豪 中级黑马   /  2012-3-27 09:44  /  1989 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程中sleep() 和yield() 的具体什么时候用更好呢?  谢谢

5 个回复

正序浏览
这里的线程有三个状态,阻塞就绪和运行。阻塞是停止运行,除非被通知或时间到了,就绪代表这个线程是随时可运行的,能否运行到就看他的优先级了。sleep是阻塞状态,yield是就绪状态
回复 使用道具 举报
sleep方法和yield方法要做个比较!线程中调用sleep方法后,本线程停止(进入阻塞状态),运行权交给其他线程。而线程中调用yield方法后本线程并不停止,运行权又本线程和优先级不低与本线程的线程来抢(这里要注意并不是优先级低的就一定抢不过优先级高的,优先级高的只是时间片大一些)。
举个简单的例子:  
当你要用迅雷下载QQ和飞信时,sleep方法相当于先下载QQ,20分钟后暂停,开始下载飞信。  
而yield方法相当于同时下载QQ和飞信,让QQ和飞信互相抢下载网速。
回复 使用道具 举报
sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常,比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
yield()它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

回复 使用道具 举报
只要明白了sleep和yield的区别之后,就容易区分什么时候运用他们了。
sleep方法暂停当前线程,会给其他线程执行的机会,不会理会其他线程的优先级。但yield方法只会给优先级相同或者优先级更高的线程执行的机会。
sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态。而yield不会将线程转入阻塞状态,他只是强制当前线程进入就绪状态。因此,某个线程完全有可能调用yield方法后,立即再获得执行的机会。
回复 使用道具 举报
这俩个都是 Thread的方法
sleep()方法是自行休眠,把cpu让给优先级别比其低的线程,当到了限定的时间后 该线程进入运行状态。
yield()是使具有与当前线程相同优先级别相同的线程有运行的机会。如果有其他的线程与当前线程有相同的优先级并且是可运行的。该方法将被调入到可运行线程池,并允许其他线程运行。如果没有相同优先级的线程是Runnable状态。那么该方法什么也不做,即该线程将继续运行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马