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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-7-16 17:53  /  1418 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中有两个用于延迟的函数
sleep() 和 wait() ,发现在无论哪个地方都能用啊
看了视频 我把所有代码的wait()方法和sleep()都给调用了
基本都能用 ,既然这样为什么还要两个方法 sun闲着么
请高手为我回答一下 它们有啥区别呢
那种情况下可以用wait(),那种情况下可以用sleep()
还有就是,之前学操作系统课程的时候,记得线程有几种不执行的状态:等待、阻塞、挂起,这在java中对应的是那些方法呢?

2 个回复

倒序浏览
第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:
    sleep()不释放同步锁,wait()释放同步锁.
   还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,
  如果时间不到你 只能调用 interreput()来强行打断;wait()可以用 notify()直接唤起.
第二种解释: sleep 是 Thread 类的静态方法。
  sleep 的作用是让线程休眠制定的时间,在时间到达时恢复,
  也就 是说 sleep 将在接到时间到达事件事恢复线程执行,
  例如:
     try{
       System.out.println("I'm going to bed");
      Thread.sleep(1000);
     System.out.println("I wake up");
     } catch(IntrruptedException e) { }
wait 是 Object 的方法,也就是说可以对任意一个对象调用 wait 方法,
调用 wait 方法将会将调用 者的线程挂起,直到其他线程调用同一个对象
  的 notify 方法才会重新激活调用者
例如:
//Thread 1
try{
     obj.wait(); //suspend thread until obj.notify() is called
     }
     catch(InterrputedException e)
    { }
第三种解释: 这两者的施加者是有本质区别的.
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,
也就是说,在线程里面决定. 好比如说,我要做的事情是 "点火->烧水->煮面",
而当我点完火之后我不立即烧水,我要休息一段时 间再烧.对于运行的主动权是
由我的流程来控制. 而 wait(),首先,这是由某个确定的对象来调用的,将这个对象
理解成一个传话的人,当这个人在某个线 程里面说"暂停!",也是 thisOBJ.wait(),
这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ 就好
比一个监督我的人站在我旁边,本来该线 程应该执行 1 后执行 2,再执行 3,而在 2 处被那个对象喊暂 停,
那么我就会一直等在这里而不执行 3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直 到那个对象
在某个地方说"通知暂停的线程启动!",也就是 thisOBJ.notify()的时候,那么我就可以煮 饭了,这个被暂停的线程
就会从暂停处 继续执行.
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,
一个是线程之间 的通讯的问题 在 java.lang.Thread 类中,提供了 sleep(),
而 java.lang.Object 类中提供了 wait(), notify()和 notifyAll()方法来操作线程 sleep()可以将一个线程睡眠,
参数可以指定一个时间。 而 wait()可以将一个线程挂起,直到超时或者该线程被唤醒。 wait 有两种形式
wait()和 wait(milliseconds). sleep 和 wait 的区别有: 1,这两个方法来自不同的类分别是 Thread 和 Object 2,最主要是 sleep 方法没有释放锁,
而 wait 方法释放了锁,使得其他线程可以使用同步控制块或 者方法。 3,wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,
而 sleep 可以在 任何地方使用 synchronized(x){ x.notify() //或者 wait() } 4,sleep 必须捕获异常,而 wait,notify 和 notifyAll 不需要捕获异常
希望对楼主有帮助。
回复 使用道具 举报
简单来说wait 等待,当代码执行到某处时 需要某些资源,而这些资源还没有到位,这时候就需要等待,线程 wait 后,会放弃本身所持有的资源,可以让其他线程进入同步代码块……使程序不至于死锁

sleep 可以理解成休眠, 让该线程 暂停 一段时间,时间到后就又有了竞争cpu 的资格, 但是在睡眠过程中他 所持有的资源并不释放……如果程序已经进入同步代码块 其他程序在它休眠期间仍不能进入

个人理解 他们关键不同在于 在线程暂停时 对所持有资源的 处理

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马