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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小飞龙 初级黑马   /  2012-7-19 16:20  /  2911 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程中sleep() 和 wait() 有什么区别?

14 个回复

倒序浏览
sleep()到了一定的时间后会自动醒来
wait()需要被notify()唤醒哈...
求技术分{:soso_e109:}
回复 使用道具 举报
sleep()是线程睡眠自动醒来,后面跟时间参数,wait()和notify()一起用,wait()相当于一个对象

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

待线程唤醒
回复 使用道具 举报
  sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.

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


评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 视频看的不错

查看全部评分

回复 使用道具 举报
sleep(time)是将正在执行的线程转到冻结状态。运行---》冻结。放弃了执行资格。如果time时间到了,那么会由冻结----》阻塞,具备执行资格,但是没有执行权。
wait()相对于sleep是少了时间参数,不会自动唤醒,需要notify()来唤醒,其他两个方法一致。
回复 使用道具 举报
sleep与wait的重要 区别是.
sleep 的应用环境不需要 锁,而wait 必须在同步块、同步方法中或加锁Lock lock =  ...     lock.lock() 与解锁lock.unlock()之内。
sleep时,释放CPU资源。但没有释放锁,所以若sleep放在同步锁中,别的线程在这个线程sleep时,是进不来的。
wait时,不仅释放了CPU资源,而且同时释放了对锁的占用。wait之后,只能通过notify或notifyall,重新进行线程预运行状态,重新竞争CPU资源。
回复 使用道具 举报
sleep用于线程控制,wait用于线程间的通信,
sleep是Thread类的方法,是线程用来控制自身流程的,wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的

由于wait函数的特殊意义,所以是放在同步语句块中的
回复 使用道具 举报
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:49
9#
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数据可被别的线程使用。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Thread.sleep()是当前线程在指定的时间处于“非运行”状态。线程一直持有对象的监视器。sleep()是一个静态方法。这意味着只对当前线程有效,一个非常常见的错误是调用tt.sleep(),这里tt是一个不同于当前线程的线程。即便是直行tt.sleep(),也是当前线程进入睡眠而不是tt线程。
Object.wait()是当前线程处于“不可运行状态”。调用wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用Object.notify(),这样将唤醒原来等待的线程,然后释放该锁。
基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁
回复 使用道具 举报
C:\Users\Administrator\Desktop\36%5BZ7$DFZ{GL8TO7KAC%G`7.jpg
回复 使用道具 举报
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行
sleep的线程是非激活状态
回复 使用道具 举报
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线程。
回复 使用道具 举报
学习了。
回复 使用道具 举报
wait方法是Objectl类中的内容
sleep方法是Thread类中的内容
并且wait只能用在同步代码块
他们的最大区别在于:
  wait 释放资源,释放锁   也就是其他线程可以访问
  sleep释放资源,不释放锁  在sleep时其他线程不可以访问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马