黑马程序员技术交流社区

标题: 线程中sleep() 和 wait() [打印本页]

作者: 小飞龙    时间: 2012-7-19 16:20
标题: 线程中sleep() 和 wait()
线程中sleep() 和 wait() 有什么区别?
作者: 王龙彪    时间: 2012-7-19 16:22
sleep()到了一定的时间后会自动醒来
wait()需要被notify()唤醒哈...
求技术分{:soso_e109:}
作者: 山水游客    时间: 2012-7-19 16:30
sleep()是线程睡眠自动醒来,后面跟时间参数,wait()和notify()一起用,wait()相当于一个对象

的等待池,线程进入后放弃所旗标进入睡眠状态,直到另一个线程调用notify()将在等待池中的第一个等

待线程唤醒
作者: 孙新强    时间: 2012-7-19 16:45
  sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.

      而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.



作者: 黑马振鹏    时间: 2012-7-19 16:51
sleep(time)是将正在执行的线程转到冻结状态。运行---》冻结。放弃了执行资格。如果time时间到了,那么会由冻结----》阻塞,具备执行资格,但是没有执行权。
wait()相对于sleep是少了时间参数,不会自动唤醒,需要notify()来唤醒,其他两个方法一致。
作者: 陈淑飞    时间: 2012-7-19 17:38
sleep与wait的重要 区别是.
sleep 的应用环境不需要 锁,而wait 必须在同步块、同步方法中或加锁Lock lock =  ...     lock.lock() 与解锁lock.unlock()之内。
sleep时,释放CPU资源。但没有释放锁,所以若sleep放在同步锁中,别的线程在这个线程sleep时,是进不来的。
wait时,不仅释放了CPU资源,而且同时释放了对锁的占用。wait之后,只能通过notify或notifyall,重新进行线程预运行状态,重新竞争CPU资源。

作者: 刘俊佳    时间: 2012-7-19 18:19
sleep用于线程控制,wait用于线程间的通信,
sleep是Thread类的方法,是线程用来控制自身流程的,wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的

由于wait函数的特殊意义,所以是放在同步语句块中的
作者: 黑马-李勇    时间: 2012-7-19 18:28
wait()                                   |sleep()
属于顶层Object类                         |属于Thread类
调用时可解除锁定(把对象锁让给其他线程)|调用时不会解除锁定
可在执行wait()期间调用线程对象中的
其他同步方法                                 |期间不能调用线程对象中的其他同步方法
wait()执行之后收回对象锁,
(1)wait(X):X毫秒之后唤醒,
(2)通过notify()或notifyAll()唤醒         |sleep(Y):Y毫秒后唤醒
wait,notify和notifyAll只能在同步控制
方法或者同步控制块里面使用                 |sleep()可以在任何地方使用

上面是论坛里前辈的
sleep(time):规定时间后自动醒
wait():等待,不自动醒
notify():唤醒等待的进程
作者: 黄锐    时间: 2012-7-19 20:54
sleep和wait的区别有:
  1,这两个方法来自不同的类分别是ThreadObject
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常


再给你介绍下:
1.sleep()方法介绍

  sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非

(a)醒来的线程具有更高的优先级。  
(b)正在运行的线程因为其它原因而阻塞
   
2.wait()方法介绍

   wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 当调用wait()后,线程会释放掉它所占有的锁标志,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
作者: 李菁    时间: 2012-7-19 21:26
Thread.sleep()是当前线程在指定的时间处于“非运行”状态。线程一直持有对象的监视器。sleep()是一个静态方法。这意味着只对当前线程有效,一个非常常见的错误是调用tt.sleep(),这里tt是一个不同于当前线程的线程。即便是直行tt.sleep(),也是当前线程进入睡眠而不是tt线程。
Object.wait()是当前线程处于“不可运行状态”。调用wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用Object.notify(),这样将唤醒原来等待的线程,然后释放该锁。
基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁
作者: 刘笑    时间: 2012-7-19 21:53
C:\Users\Administrator\Desktop\36%5BZ7$DFZ{GL8TO7KAC%G`7.jpg
作者: 陈欢    时间: 2012-7-19 22:04
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行
sleep的线程是非激活状态
作者: 孙浩迪    时间: 2012-7-19 22:31
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该
  进程:如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源
  ,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interupt()
  方法而产生。
  
  sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态
  不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释
  放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中可能被其他对象调用它的
  interrupt(),产生interruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态
  如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
  
  注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,
  它只会是使当前线程被sleep而不是t线程。
作者: 黄一    时间: 2012-7-19 23:38
学习了。
作者: 陌花╮有意、    时间: 2012-7-19 23:41
wait方法是Objectl类中的内容
sleep方法是Thread类中的内容
并且wait只能用在同步代码块
他们的最大区别在于:
  wait 释放资源,释放锁   也就是其他线程可以访问
  sleep释放资源,不释放锁  在sleep时其他线程不可以访问




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