黑马程序员技术交流社区

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

作者: 雷剑腾    时间: 2012-11-26 09:16
标题: sleep()和wait()
这两个方法都能让线程等待。那他们本质的区别是什么呢?他们各在什么情况下使用的?还是两者能替换使用?这个还是有些模糊。。大神们帮帮忙,越详细越好。。
作者: 崔利鹏    时间: 2012-11-26 09:22
sleep()不是放锁,而wait()是释放的。通俗的说,sleep()就是睡眠一段时间后自动醒来。而wait()则是等待,直到有线程通知(notify())唤醒他才会重新工作。就好比你睡觉,早上自然就行了,然后就去上班/上学了。而和朋友出去玩,约好不见不散,你早到了,就会一直等,一直到你朋友来了告诉你“我来了”,然后你才会继续执行接下来的事情。
作者: 吴新    时间: 2012-11-26 09:48
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,====不会让出系统资源====,wait是进入等待池等待,====让出系统资源====,其他线程可以占用cpu,一般wait不会加时间限制,但是需要notify叫醒。比如你每秒打印一个时间 就用sleep,要是模拟儿子买盐妈妈做饭就2种都要用。一般别替换使用,反正我是没有替换使用过。菜鸟见解 仅供参考。
作者: 崔政    时间: 2012-11-26 18:46
崔利鹏 发表于 2012-11-26 09:22
sleep()不是放锁,而wait()是释放的。通俗的说,sleep()就是睡眠一段时间后自动醒来。而wait()则是等 ...

那wait(long times) 和sleep(long times) 有什么区别呢,我今天写个小程序,当前线程用sleep一会可以醒来,但是用wait(1000),却报错了,我记得老毕好像说过原因,我不记得了,哥们记得不?
作者: 王舒玮    时间: 2012-11-26 21:14
它们一般不单独使用,一般都是在同步代码块里面。
sleep可以单独使用,就是让当前的程序等待一会。
wait一般用在同步,还得和notify结合使用。

wait:让线程等待
notify:唤醒队列中的第一个线程
notifyAll:唤醒所有线程
作者: 黑马-王宁    时间: 2012-11-27 18:31
1、这两个方法来自不同的类分别是Thread和Object

  2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

  3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在

  任何地方使用(使用范围)

  synchronized(x){

  x.notify()

  //或者wait()

  }

  4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

  扩充阅读:

  java 线程中的sleep和wait有一个共同作用,停止当前线程任务运行,但他们存在一定的不同,首先我们先看sleep中的构造函数

  sleep(long millis)           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.

  sleep(long millis, int nanos)          Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.

  sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

  注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程

  wait方法

  void wait(long timeout)

  Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

  void wait(long timeout, int nanos)

  Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

  wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生

  InterruptedException,效果以及处理方式同sleep()方法

作者: 王阳    时间: 2012-11-28 20:00
形象点说,就是Sleep就是吃了一片安眠药,起到一个睡眠作用,能多睡一会,而wait()则是吃了一瓶安眠药,需要去洗胃。(也就是唤醒进程才能继续运行)才可以运行。




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