sleep 跟 wait有什么区别?
来源:互联网 发布:linux的ps命令 编辑:程序博客网 时间:2024/06/10 12:12
来自: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() 有什么区别
- 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有什么区别
- sleep和wait有什么区别
- Android布局之TableLayout(表格布局)
- 单播、广播、组播(多播)
- 10 CSS3 and jQuery Loading Animations Solutions
- JSON入门
- WebApplicationContext 文章
- sleep 跟 wait有什么区别?
- 学习android JNI的那些事儿--------4. Field & Method --> Accessing Field
- 从爱到爱的距离--父亲 墨尘缘
- C语言和设计模式(总结篇)
- 我们是否有为梦想真正的实干一把?
- 编译执行和解释执行等的区别
- Android项目的目录结构
- MS SQL SERVER 2008 “阻止保存要求重新创建表的更改” 解决办法
- linux下编程学习----- 远程过程调用(rpc)