码迷,mamicode.com
首页 > 其他好文 > 详细

sleep()方法和wait()方法的区别

时间:2014-07-16 18:52:38      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   color   使用   strong   

1、来源不同:

     sleep()方法来自于 Thread 类的一个静态方法, 只有继承了线程类的子类才能调用该方法,且谁调用的谁去睡觉,即使在 A 线程里调用了 B 的sleep方法,实际上还是 A 去睡觉,要让 B 线程睡觉要在 B 的代码中调用sleep。

1 static void sleep(long millis);  //在指定的毫秒数内对当前正在执行的线程进行休眠操作
2 static void sleep(long millis,  int nanos);  //在指定的毫秒加纳秒内对当前执行线程进行休眠操作

   wait()方法来自于 Object 类,Object类所有Java类的祖先。所以任何一个类都可以调用wait()方法。

1 void wait();  //在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
2 void wait(long timeout);  //在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,导致该线程等待
3 void wait(long timeout, int nanos); //在其他线程对用此对象的notify()方法或notifyAll()方法,或者其他某个线程终端当前线程,或者已超出某个实际时间量前,当前线程等待

 

2、最主要sleep()方法没有释放锁,而 wait() 方法释放了锁,使得其他线程可以使用同步控制块或者方法。就如同蹲坑,就算在马桶上睡着了也不让出这个坑,你睡醒了还可以继续,这就是sleep();拉到一半被boss换出去,让出资源,这就是wait(),决定你再次蹲上这个坑的是boss的唤醒。

      所以通常可以描述为 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不需要捕获异常

 

sleep()方法和wait()方法的区别,布布扣,bubuko.com

sleep()方法和wait()方法的区别

标签:style   blog   java   color   使用   strong   

原文地址:http://www.cnblogs.com/liujianli405/p/3845073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!