sleep 跟 wait有什么区别?
2012-02-28 09:01
274 查看
来自:http://hi.baidu.com/guessa/blog/item/e3a9584334e2121b9313c6c9.html
第一: sleep是Thread对象里面的方法; wait是Object对象里面的方法; 第二: 当一个synchorized成员sleep的时候并不会释放掉synchorized; 但是当一个synchorized成员wait的时候是会释放掉synchorized的; 第三: 一个对象在sleep的时候是有时间设定限制的,除非在sleep设定时间内被中途打断,就会抛出InterruptedException异常; 一个对象在wait的时候没有时间限制,会让对象一直暂停下去,当有其他对象去调用他的notify或者调用全局的notifyAll的时候才会开始继续执行。 这两者的施加者是有本质区别的,从而对应不同的应用环境. 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不需要捕获异常 //分析这段程序,并解释一下,着重讲讲synchronized、wait(),notify 谢谢! public class WaitAndNotify { public static void main(String args[]){ ThreadB b = new ThreadB(); b.start(); System.out.println("b is start..."); synchronized(b){ try{ System.out.println("Waiting for b to complete..."); b.wait(); System.out.println("Completed now back to main thread"); }catch(InterruptedException e){ } } System.out.println("total is :"+ b.total); } } /** * extend the class Thread to realize ThreadB * notify()与b.wait()相呼应,及计算完事后被唤醒调用 * 因为一些程序块是可以分开运行的,但对b的同步操作,必须 * 等到notify() */ class ThreadB extends Thread{ int total; public void run(){ synchronized(this){ System.out.println("ThreadB is running..."); for(int i=0; i<100; i++){ total += i; System.out.println("total is " + total); } notify(); } } } 要分析这个程序,首先要理解notify()和wait(),为什么在前几天纪录线程的时候没有纪录这两个方法呢,因为这两个方法本来就不属于Thread类,而是属于最底层的object基础类的,也就是说不光是Thread,每个对象都有notify和wait的功能,为什么?因为他们是用来操纵锁的,而每个对象都有锁,锁是每个对象的基础,既然锁是基础的,那么操纵锁的方法当然也是最基础了. 再往下看之前呢,首先最好复习一下Think in Java的14.3.1中第3部分内容:等待和通知,也就是wait()和notify了. 按照Think in Java中的解释:\"wait()允许我们将线程置入“睡眠”状态,同时又“积极”地等待条件发生改变.而且只有在一个notify()或notifyAll()发生变化的时候,线程才会被唤醒,并检查条件是否有变.\" 我们来解释一下这句话. \"wait()允许我们将线程置入“睡眠”状态\",也就是说,wait也是让当前线程阻塞的,这一点和sleep或者suspend是相同的.那和sleep,suspend有什么区别呢? 区别在于\"(wait)同时又“积极”地等待条件发生改变\",这一点很关键,sleep和suspend无法做到.因为我们有时候需要通过同步(synchronized)的帮助来防止线程之间的冲突,而一旦使用同步,就要锁定对象,也就是获取对象锁,其它要使用该对象锁的线程都只能排队等着,等到同步方法或者同步块里的程序全部运行完才有机会.在同步方法和同步块中,无论sleep()还是suspend()都不可能自己被调用的时候解除锁定,他们都霸占着正在使用的对象锁不放. 而wait却可以,它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人(这里应该是程序块,或线程)用,这意味着可在执行wait()期间调用线程对象中的其他同步方法!在其它情况下(sleep啊,suspend啊),这是不可能的. 但是注意我前面说的,只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程还是要把这个对象锁收回来的呀.wait什么?就是wait别人用完了还给我啊! 好,那怎么把对象锁收回来呢? 第一种方法,限定借出去的时间.在wait()中设置参数,比如wait(1000),以毫秒为单位,就表明我只借出去1秒中,一秒钟之后,我自动收回. 第二种方法,让借出去的人通知我,他用完了,要还给我了.这时,我马上就收回来.哎,假如我设了1小时之后收回,别人只用了半小时就完了,那怎么办呢?靠!当然用完了就收回了,还管我设的是多长时间啊. 那么别人怎么通知我呢?相信大家都可以想到了,notify(),这就是最后一句话\"而且只有在一个notify()或notifyAll()发生变化的时候,线程才会被唤醒\"的意思了. 因此,我们可将一个wait()和notify()置入任何同步方法或同步块内部,无论在那个类里是否准备进行涉及线程的处理。而且实际上,我们也只能在同步方法或者同步块里面调用wait()和notify(). 这个时候我们来解释上面的程序,简直是易如反掌了. synchronized(b){...};的意思是定义一个同步块,使用b作为资源锁。b.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行,在这里要用同一把锁的就是b线程本身.这个线程在执行到一定地方后用notify()通知wait的线程,锁已经用完,待notify()所在的同步块运行完之后,wait所在的线程就可以继续执行. |
相关文章推荐
- 线程中sleep和wait有什么区别
- sleep() 和 wait() 有什么区别?
- sleep和wait有什么区别
- sleep()方法和wait()方法的区别是什么?
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- sleep和wait有什么区别?
- java中的wait()方法和sleep()方法的区别是什么?| Java 基础
- sleep()和wait()有什么区别
- sleep和wait有什么区别
- sleep() 和 wait() 有什么区别?
- sleep和wait有什么区别
- sleep和wait有什么区别。
- sleep() 和 wait() 有什么区别?
- sleep和wait有什么区别
- sleep()和wait()有什么区别?
- sleep() 和 wait() 有什么区别
- sleep() 和 wait() 有什么区别
- sleep和wait分别是那个类的方法,有什么区别
- sleep() 和 wait() 有什么区别
- sleep() 和 wait() 有什么区别?