sleep() 和 wait() 的区别

sleep() 和 wait() 的区别sleep 方法是线程类 Thread 的静态方法 让调用线程进入睡眠状态 让出执行机会给其他线程 等到休眠时间结束后 线程进入就绪状态和其他线程一起竞争 cpu 的执行时间 因为 sleep 是 static 静态的方法 他不能改变对象的机锁 当一个 synchronized 块中调用了 sleep 方法 线程虽然进入休眠 但是对象的机锁没有被释放

结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了。这篇博客就一起学习这两个方法

sleep()

下面用一个例子来演示:

Service类:

public class Service { public void mSleep(){ synchronized(this){ try{ System.out.println(" Sleep 。当前时间:"+System.currentTimeMillis()); Thread.sleep(3*1000); } catch(Exception e){ System.out.println(e); } } } public void mWait(){ synchronized(this){ System.out.println(" Wait 。结束时间:"+System.currentTimeMillis()); } } } 

就定义了两个方法, mSleep()方法会让调用线程休眠3秒,mWait() 就打印一句话。两个方法都使用了同步锁。

SleepThread类:

public class SleepThread implements Runnable{ 
    private Service service; public SleepThread(Service service){ this.service = service; } public void run(){ service.mSleep(); } } 

线程类,用于调用Service 的mSleep方法

WaitThread类:

public class WaitThread implements Runnable{ 
    private Service service; public WaitThread(Service service){ this.service = service; } public void run(){ service.mWait(); } } 

线程类,用于调用Service 的mWait方法

测试类:

public class Test{ public static void main(String[] args){ Service mService = new Service(); Thread sleepThread = new Thread(new SleepThread(mService)); Thread waitThread = new Thread(new WaitThread(mService)); sleepThread.start(); waitThread.start(); } } 

梳理一下逻辑:

如果sleepThread释放了机锁的话,waitThread 的任务会马上得到执行。从打印结果可以看出,waitThread 的任务是3秒钟之后才得到执行。

synchronized(this){ System.out.println(" Wait 。结束时间:"+System.currentTimeMillis()); }

相信现在你已经理解了sleep方法没有释放机锁会带来什么结果了,那么继续wait

wait()

wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程

下面修改程序如下所示:

public class Service { public void mSleep(){ synchronized(this){ try{ Thread.sleep(3*1000); this.notifyAll(); System.out.println(" 唤醒等待 。 结束时间:"+System.currentTimeMillis()); } catch(Exception e){ System.out.println(e); } } } public void mWait(){ synchronized(this){ try{ System.out.println(" 等待开始 。 当前时间:"+System.currentTimeMillis()); this.wait(); }catch(Exception e){ System.out.println(e); } } } } 

测试类:

public class Test{ public static void main(String[] args){ Service mService = new Service(); Thread sleepThread = new Thread(new SleepThread(mService)); Thread waitThread = new Thread(new WaitThread(mService)); waitThread.start(); sleepThread.start(); } } 

这里是先让 waitThread线程启动起来,然后waitThread线程进入等待状态,并释放了Service对象的锁,这时sleepThread也启动了,来到了mSleep方法的同步代码块,因为之前的waitThread线程已经释放了Service对象的机锁,sleepThread可以拿到对象锁,所以mSleep方法是会被马上调用的。然后sleepThread线程就是进入了睡眠状态,等到3秒休眠结束后调用notifyAll()唤醒了waitThread线程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221695.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午5:30
下一篇 2026年3月17日 下午5:30


相关推荐

  • xpath爬取美女图片

    xpath爬取美女图片尝试了一下用xpath爬取图集谷上面的美女图片,这次选择的是阿朱小姐姐,下面详细介绍如何爬取该网站中阿朱小姐姐的全部套图。网址如下:https://www.tujigu.com/t/437/

    2022年7月27日
    8
  • 查看traceID

    查看traceIDadbshellcat proc pid status

    2026年3月17日
    3
  • ArrayList 和 LinkedList[通俗易懂]

    ArrayList 和 LinkedList[通俗易懂]ArrayList 和 LinkedList

    2022年4月22日
    41
  • Absolute(绝对定位)与relative(相对定位)的图文讲解

    Absolute(绝对定位)与relative(相对定位)的图文讲解Position 的属性值有 1 nbsp nbsp nbsp nbsp nbsp Absolute 绝对定位 是相对于最近的且不是 static 定位的父元素来定位 2 nbsp nbsp nbsp nbsp nbsp Fixed 绝对定位 是相对于浏览器窗口来定位的 是固定的 不会跟屏幕一起滚动 3 nbsp nbsp nbsp nbsp nbsp Relative 相对定位 是相对于其原本的位置来定位的 4 nbsp nbsp nbsp nbsp nbsp Static 默认值 没有定位 5 nbsp nbsp nbsp nbsp nbsp Inherit 继承父元素的 position 值 对于初

    2026年3月18日
    1
  • 计算机病毒防治——计算机病毒种类

    计算机病毒防治——计算机病毒种类在介绍病毒种类之前,先来介绍一些常识1、计算机病毒防治要确定安全的度,针对不同的指标设立不同的安全手段,通过以下三个方面来确定度: <1>安全威胁 <2>被保护物品的价值 <3>安全措施所要达到的目标 当攻破防御的成本大于得到数据的收益时,则系统相对来说攻击的人员较少,这时称这个系统是安全的。2、病毒是指是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并且能够自我复制的一组计算机指令或者程序代码。它的根本特点是能够进行自我复制

    2022年6月4日
    54
  • 怎样才算得上是全栈程序员?

    与其他互联网热词一样,”全栈“程序员也是英译过来的,英文全文是:Full-Stack Developer,你想啊,中国人民怎么会用客栈的栈、堆栈的栈来形容工程师呢? 谈论一个概念,…

    2020年10月17日
    4.1K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号