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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周君洲 黑马帝   /  2011-9-22 17:56  /  2317 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在线程中这2个方法主要区别是什么呢?

6 个回复

倒序浏览
黑马网友  发表于 2011-9-22 19:34:28
沙发
sleep()是Thread静态方法,只能在当前线程被调用。主要用来让当前线程睡眠,睡眠过程中紧抱着锁对象不放,这样的话线程也不能继续下去,只有当睡眠时间到了该进程才能继续下去。
wait()方法是Object类方法。也是让线程睡眠,但与sleep方法最大的不同是,睡眠过程中会释放锁对象,这样的话其他线程可以锁住该对象。如果wait住了话,可以通过notfiy方法来叫醒该进程。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 19:45:50
藤椅
顶楼上:lol
回复 使用道具 举报
黑马网友  发表于 2011-9-22 21:28:01
板凳
sleep()是睡觉睡到自然醒
wait()是睡觉睡到老妈喊你才醒

评分

参与人数 1技术分 +1 收起 理由
admin + 1 很幽默的童鞋!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-22 21:47:40
报纸

回复 沙发 的帖子

我来补充下
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。
   如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
   需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException。

不同点:
1. Thread类的方法:sleep(),yield()等
   Object的方法:wait()和notify()等
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
   sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

评分

参与人数 1技术分 +2 收起 理由
admin + 2 很详细哦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-25 07:22:09
地板
毕老师的视频中讲解过的.:

sleep();在多线程中称为冻结状态, 线程在调用sleep方法后,进入休眠状态,此时线程并不失去已获得的

锁旗标,当休眠时间到 ,线程从冻结状态恢复为运行状态..

而wait();也是冻结状态, 和sleep不同的是, wait没有休眠时间 ,, 而是直到被唤醒为止, 与其对应

使用的是notify(); , 即:唤醒...
回复 使用道具 举报
黑马网友  发表于 2011-9-25 10:02:01
7#

回复 楼主 的帖子

sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源。

评分

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

查看全部评分

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