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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fenzheng 中级黑马   /  2014-4-22 23:07  /  999 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程里面的sleep()方法和wait()方法有什么区别?

4 个回复

倒序浏览
sleep()方法是使线程停止一段时间的方法。
在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非:
(a)“醒来”的线程具有更高的优先级。            
(b)正在运行的线程因为其它原因而阻塞。

wait()是线程交互时,如果线程对一个同步对象x发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
都能让线程进入冻结状态:
sleep  :可以自己设置冻结时间,时间到了,自动唤醒,拥有执行权,等待cpu资源;
wait     : 强制线程进入冻结状态,要唤醒线程需要notify或者notifyAll来手动唤醒;
回复 使用道具 举报
wait和sleep区别: 分析这两个方法:从执行权和锁上来分析: 
  wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者
notifyAll来唤醒。 
  sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
   wait:线程会释放执行权,而且线程会释放锁。 
Sleep:线程会释放执行权,但不是不释放锁。  

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
wait方法主要用作线程间的同步,sleep方法是让线程休眠一段时间后继续执行。

我从线程的状态说一下,两个方法执行后的区别

sleep方法执行后,当前线程会进入“阻塞状态”,sleep时间结束后进入“可运行状态”,可运行状态的线程被OS选中后获取时间片才会进入“运行状态”开始执行。需要注意的是:线程在sleep期间是不会释放锁的。

wait方法调用后,线程会释放锁,然后被放入一个“等待队列”(等待再一次获取锁,等待队列中的线程可能不只一个)。当对应的notify或者notifyAl方法执行后,等待队列中的线程会进入“锁池状态”,锁池状态的线程只有拿到锁的才可以进入“可运行状态”,可运行状态的线程被OS选中后获取时间片才会进入“运行状态”开始执行。

线程的状态转变还是比较多的  建议楼主看看《thinking in java》,书里面讲的比较详细。  

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马