黑马程序员技术交流社区

标题: sleep与wait [打印本页]

作者: 周一川    时间: 2013-4-9 17:18
标题: sleep与wait
sleep() 和 wait() 有什么区别?
作者: 王怀亮    时间: 2013-4-9 18:24
1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
5、sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。  
这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非以下两种情况:  
(a)“醒来”的线程具有更高的优先级   
(b)正在运行的线程因为其它原因而阻塞。  
6、wait()是线程交互时,如果线程对一个同步对象 x 发出一个 wait()调用,该线程会暂停执行,被  
调对象进入等待状态,直到被唤醒或等待时间到。
作者: HM汪磊    时间: 2013-4-9 18:29
sleep方法没有释放锁需要等待此线程执行完其它线程才可以执行,wait方法释放了锁其它线程可以继续执行
作者: ①人←①城市    时间: 2013-4-9 18:35
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
作者: 张源锋    时间: 2013-4-9 18:37
主要有几点:
1,这两个方法来自不同的类分别是Thread和Object
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
  1. synchronized(x){
  2. x.notify()
  3. //或者wait()
  4. }
复制代码
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2