黑马程序员技术交流社区

标题: sleep()和wait()的区别 [打印本页]

作者: 李道福    时间: 2013-4-4 23:08
标题: sleep()和wait()的区别
本帖最后由 李道福 于 2013-4-5 10:29 编辑

sleep()和wati()都会释放执行权,会不会释放执行资格?
作者: 炉海佳    时间: 2013-4-4 23:32
本帖最后由 炉海佳 于 2013-4-4 23:36 编辑

sleep占着CPU去睡觉,其它线程不能用CPU,睡醒了继续工作,所以不会释放执行权 并且是静态的可以直接调用Thread.sleep(100L);
wait是进入线程等待池等待,它也就不占用cpu,其它程可以使用cpu,所以会释放执行权,并且他是Object类,谁调用他谁挂起
作者: 刘林虎    时间: 2013-4-4 23:47
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不需要捕获异常

作者: 李道福    时间: 2013-4-5 00:14
刘林虎 发表于 2013-4-4 23:47
1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法 ...

wait(),notity(),notifyAll()为什么不需要捕获异常?你试一下,不捕获能通过编译嘛?
作者: 张权    时间: 2013-4-5 01:42
本帖最后由 张权 于 2013-4-5 01:49 编辑

前面几点回答的很好, 就是最后一点有问题, wait()方法是要捕获异常,或者抛异常的;  notify()和notifyall(),不用抛异常, 还有, 如果wait()方法带参数, 其实和sleep()方法差不多..不过要注意, 调用wait( )方法是用线程的锁调用, 而不是线程,而且wait( )方法只有在同步的时候才能用!!
作者: 影响力147753321    时间: 2013-4-5 09:13
本帖最后由 影响力147753321 于 2013-4-5 11:48 编辑

首先要明确一点。sleep()是线程的静态方法。wait()是的方法。相同点是都能使当前线程处于阻塞状态。而在这个状态下,二者都没有执行资格了。更别提执行权了。不同点是sleep()用于可以操作线程的任何地方使线程阻塞。可以用时间使它自动醒来。如果用在同步中。不会释放锁。wait()一般用于同步方法或同步代码块中。用于某个对象对它的调用使当前线程挂起(同时会释放锁)直至有其它线程调用这个对象的notify()方法把它唤醒。
作者: 李道福    时间: 2013-4-5 10:28
影响力147753321 发表于 2013-4-5 09:13
首先要明确一点。sleep()是线程的静态方法。wait()是的方法。相同点是都能使当前线程处于阻塞状态。而在这 ...

wait()是要捕获异常的,wait()上有两个异常,一个是运行时异常,不用捕获,一个是非运行时异常是要捕获的,不捕获,通过不了编译




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