java中wait和java sleep与wait区别的区别

java sleep和wait的区别的疑惑? - 知乎118被浏览12640分享邀请回答5添加评论分享收藏感谢收起Java 中 wait 与 sleep的区别 - 简书
Java 中 wait 与 sleep的区别
原文:/2012/08/what-are-difference-between-wait-and.htmlWait vs sleep在Java多线程面试里面,经常被问到wait() 和 sleep() 的区别。虽然 wait 和 sleep 都能将线程状态变成等待状态,但是它们在行为和使用方式上完全不一样的。Thread.sleep(long millis) 会暂停、释放CPU资源和给其他线程有执行的机会,而wait用于Java线程之间的通信。wait方法定义在java.lang.Object类里面,也就是说每个对象都能使用到。这是以对象锁为基础的,如果你记得在Java里面每一个对象都有隐藏锁,也叫监视器(monitor)。当一个线程进入一个synchronized方法的时候它会获得一个当前对象的锁,而当进入的是静态(static)的synchronized方法的时候获得的是这个类的锁。使用wait()和notify()这两个方法可以使得两个线程之间进行通信,这也是解决很多多线程问题的关键,比如生产者-消费者问题,哲学家就餐问题,读和写的问题和实现一些并发的设计。在这个教程,你会学到下列关于wait()和sleep()方法的问题:1、什么是wait()方法?2、什么是sleep()方法?3、它们之间有什么区别?4、在什么地方使用到wait和sleep?话说,如果你是在准备面试Java的话我建议你还是看一下Java Programming Interview Exposed,一本非常不错的Java面试书籍。Java里面的wait和sleep方法是什么wait方法定义在Object类里面,所有对象都能用到,在线程通信中,wait()方法经常与notify()和notifyAll()方法一起使用。当达到某种状态的时候,wait()方法让线程进入等待状态,比如生产者-消费者问题中,当队列满了的时候,生产者这时候需要等待,同样,当队列空的时候,消费者也需要等待。notify()方法用于唤醒正在等待的线程,这个线程即将停止等待的状态,比如生产者线程往空队列里面增加一个元素,此时notify方法会通知消费者线程这个队列不再为空。另外,sleep()方法在Java应用中用于暂停线程。当一个线程不用做其他事了,你可以调用sleep方法将线程睡眠,它会在一定时间内放弃当前的CPU资源。当一个线程已经是睡眠状态的时候一段时间后它会正常的唤醒,也可以通过线程中断的特殊方式将它唤醒。Java线程中wait和sleep方法的区别在最后一部分中我们可以看到什么是wait()和sleep()和它们之间的区别。正如我之前所说,除了等待之外,它们是完全不同的:1)第一个很重要的区别就是,wait方法必须正在同步环境下使用,比如synchronized方法或者同步代码块。如果你不在同步条件下使用,会抛出IllegalMonitorStateException异常。另外,sleep方法不需要再同步条件下调用,你可以任意正常的使用。2)第二个区别是,wait方法用于和定义于Object类的,而sleep方法操作于当前线程,定义在java.lang.Thread类里面。3)第三个区别是,调用wait()的时候方法会释放当前持有的锁,而sleep方法不会释放任何锁。4)wait方法最好在循环里面调用,是为了处理错误的通告,比如说,即使线程唤醒了,等待状态仍然适用。(看不懂?大概是循环里面再判断一次线程是否真的醒来),然而sleep方法没这样的限制。最好别在循环里面调用sleep方法。下面是关于调用wait和sleep方法的代码片段:```synchronized(monitor){while(condition ==true){monitor.wait())//releases monitor lock}Thread.sleep(100);//puts current thread on Sleep```5)还有一个很大的区别是,一个是静态方法,一个不是。什么时候用wait和sleep方法?从阅读wait和sleep方法相关属性和行为说明可以清楚的知道,wait()方法通常结合notify()或者notifyAll()方法在两个线程通信中使用,而Thread.sleep()方法是个让程序或者线程暂停的的工具方法。wait方法的调用需要同步环境这个必要条件才能进行,而sleep方法不需要。完整的总结一下wait和sleep方法的区别和不同的使用场景。一般wait()和notify()方法使用于线程间的通信;sleep()方法用于暂停当前线程的执行。同时要注意,wait()方法会释放锁,而sleep()方法会一直持有锁(直到睡眠结束)。所以如果你的设计中线程等待需要释放锁的话使用wait方法和nofity方法,否则使用sleep()方法.结尾第一次翻译文章,翻译有点生硬,望见谅,也欢迎指出翻译不妥之处。sleep() wait() notify/notifyAll() 的区别 - 企业应用 - Java - ITeye论坛
sleep() wait() notify/notifyAll() 的区别
锁定老帖子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (9) :: 隐藏帖 (0)
haobaoipv6
等级: 初级会员
来自: 北京
发表时间:&&
相关知识库:
看了一下线程这方面的知识,也结合了一些 面试的题 总结如下:
一些基础的就不说了,主要说一下这里面的几个方法,也是object的通用方法。
sleep()&&&& wait()&&&& notify/notifyAll()&& 的区别
sleep()是线程类的方法,sleep() 允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。说白了 ,也就是把机会给其他线程,但是监控状态依然保持。重要的一点就是 当调用sleep()方法是 不会 释放对象锁的。
下面详细讲一下 : wait()&&&& notify/notifyAll()&& 的区别
先来谈谈为什么所有的类中都有这一对方法,看是很奇怪,其实是 Thread类提供的,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。
notify()是释放对象的wait()方法而阻塞线程(但是也要当得到锁后才可以运行)但是这个释放是随机的,也就是不一定要释放那个线程。(因为调用同一资源的可能不是一个线程或者说是有多个阻塞的线程在等待,但是如果加了synchronized也只有一个线程,也有其他的线程在等待中,也就是阻塞)我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。
但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。
  同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现 IllegalMonitorStateException 异常。
谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。
t365.home.sunbo.net
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术public class MultiThread {
private static class Thread1 implements Runnable{
public void run() {
//由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
//所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
synchronized(MultiThread.class){
System.out.println(&enter thread1 ...&);
System.out.println(&thread1 is waiting&);
//释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
//(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
MultiThread.class.wait();
}catch(InterruptedException e){
e.printStackTrace();
System.out.println(&thread1 is going on ...&);
System.out.println(&thread1 is being over!&);
private static class Thread2 implements Runnable{
public void run() {
//notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
//因为thread2没有释放锁,所以Thread1得不到锁而无法执行
synchronized(MultiThread.class){
System.out.println(&enter thread2 ...&);
System.out.println(&thread2 notify other thread can release wait status ...&);
MultiThread.class.notify();
System.out.println(&thread2 is sleeping ten millisecond ...&);
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
System.out.println(&thread2 is going on ...&);
System.out.println(&thread2 is being over!&);
public static void main(String[] args) {
new Thread(new Thread1()).start();
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
new Thread(new Thread2()).start();
本文已收录于以下专栏:
相关文章推荐
第一种解释:
功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.  
   
  还有用法的上的不同是:sleep(milliseco...
使用interrupt()中断线程
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
在Java中,一个对象可以有synchronized方法或别的加锁机制来防止别的任务在互斥还没有释放的时候就访问这个对象。线程是可以阻塞的,某个线程在等待另一个线程,而后者又在等待别的...
Maven的仓库、索引
中央仓库:目前来说,http://repo1.maven.org/maven2/ 是真正的Maven中央仓库的地址,该地址内置在Maven的源码中,其它地址包括著名的ibib...
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。
因为sleep() ...
最近在Review线程专栏,修改了诸多之前描述不够严谨的地方,凡是带有Review标记的文章都是修改过了。本篇文章是插进来的,因为原来没有写,现在来看传统线程描述的不太完整,所以就补上了。理解了线程同...
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。
1.对于sleep()方法,是属于Thread类中的。而wait()方法,则是属于Object类中的。
2.最主要是sleep方法没有释放锁,而 wait 方法释放了锁,使得其他线程可以使用同步控制块...
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)java sleep(1000)和wait(1000)有区别么?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
该问题可能描述不清,建议你
java sleep(1000)和wait(1000)有区别么?
我有更好的答案
本来该线程应该执行1后执行2,再执行3,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而当我点完火之后我不立即烧水,我要休息一段时间再烧;Thread 1try{obj,而wait:
1,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,也就是说sleep将在接到时间到达事件事恢复线程执行,例如!&quot。
3,首先,这是由某个确定的对象来调用的,但这个流程并没有结束,我一直想去煮饭,但还没被允许:/&#47.Object类中提供了wait().notify() is called}catch(InterrputedException e) {}第三种解释:这两者的施加者是有本质区别的.第二种解释,还是&烧水-&煮面&,在线程里面决定.sleep(1000);),而wait方法释放了锁,sleep必须捕获异常。
wait有两种形式wait()和wait(milliseconds).sleep和wait的区别有.其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题在java,提供了sleep(),而java.lang:try{System.out.println(&I'm going to bed&);Thread.wait(),这里的暂停是阻塞;wait()可以用notify()直接唤起;System.out.println(&I wake up&quot。而wait()可以将一个线程挂起,直到超时或者该线程被唤醒;/或者wait()
4.lang.Thread类中第一种解释:功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁.对于运行的主动权是由我的流程来控制, notify()和notifyAll()方法来操作线程sleep()可以将一个线程睡眠,参数可以指定一个时间;,thisOBJ就好比一个监督我的人站在我旁边.好比如说,我要做的事情是 &点火-&gt.
还有用法的上的不同是,也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处继续执行,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3.wait();/,也是 thisOBJ,wait()释放同步缩.notify()
&#47:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断. sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说;}catch(IntrruptedException e) {}wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如;点火-&烧水-&gt, 直到那个对象在某个地方说&通知暂停的线程启动!&,使得其他线程可以使用同步控制块或者方法;/suspend thread until obj.而wait(),将这个对象理解成一个传话的人,当这个人在某个线程里面说&暂停;煮饭&quot,而sleep可以在
任何地方使用
synchronized(x){
x:sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复
采纳率:60%
public final void wait(long timeout)
:在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
当前线程必须拥有此对象监视器。
timeout :大约已经到达指定的实际时间seelp()就是睡眠好多毫秒,然后继续
请查看这个帖子
为您推荐:
其他类似问题
java的相关知识
等待您来回答

我要回帖

更多关于 wait sleep 区别 的文章

 

随机推荐