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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a464538715 中级黑马   /  2013-6-6 12:45  /  2140 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 a464538715 于 2013-6-6 22:55 编辑

sleep()和wait()有什么区别

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

7 个回复

倒序浏览
功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.   
  还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

回复 使用道具 举报
sleep就像手机的自动开机功能,而wait就是关机了,要开的话,必须自己动手开。
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
wait()是Object下的方法,sleep()是Thread类中的静态方法
wait()需要被notify唤醒,sleep()可定时自己醒
wait()后就释放了资源锁,sleep()不释放资源锁
wait()只能再同步代码块中使用(有资源锁的环境下),sleep()没这个局限
回复 使用道具 举报
这么经典的问题,当然需要经典的答案,看看我的总结:
1.核心区别:
sleep用于线程控制,wait用于线程间的通信。
sleep是Thread类的方法,是让线程休息一段时间,然后自动恢复运行,与其他线程无关,与同步无关,也与锁无关(拿锁时不会释放锁)。
wait是Object类的方法,也就是锁的方法,必然在同步中,根据java7.0的解释(The thread releases ownership of this monitor and waits),wait就是让当前线程释放锁并等待。(java 1.6中文版API翻译是错误的,“该线程发布对此监视器的所有权并等待”,release应该翻译成释放)。
public static void sleep(long millis)
                  throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
public final void wait()
                throws InterruptedException
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0).
The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。

2.唤醒和中断
sleep一觉睡到自然醒,wait就必须其他拿锁的线程调用notify(唤醒一个)或notifyAll(全部唤醒)方法来唤醒。wait的线程被唤醒后,不会立即执行,它要和其他具备执行资格的线程正常的争抢执行权。
由于sleep和wait会使线程处于阻塞或冻结状态,可能等不到所等的事件而无法终止,所以需要从外部调用interrupt()方法中断他们的阻塞状态,此时就会抛InterruptedException异常(API对这个异常的描述为:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。关于如何处理InterruptedException异常,参见资料http://www.ibm.com/developerworks/cn/java/j-jtp05236.html。)

参考资料:java多线程 sleep()和wait()的区别
http://www.cnblogs.com/octobershiner/archive/2011/10/28/2227705.html

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报

RE: sleep()和wait()

(1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。
(2)sleepThread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了bsleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。而wait()Object类的非静态方法
(3)sleep()释放资源不释放锁,而wait()释放资源释放锁;
(4)使用范围:wait,notifynotifyAll只能在同步控制方法或者同步控制块里面使用,sleep可以在任何地方使用

回复 使用道具 举报
加油兄弟  你的辛苦  我看到了  分数已加
回复 使用道具 举报
袁梦希 发表于 2013-6-9 14:31
加油兄弟  你的辛苦  我看到了  分数已加

其实   关键是这里没有资源分享帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马