首页 > 趣闻 > 正文内容

多线程中sleep、yield与wai的区别:避坑指南

趣闻2025-05-27 22:15:01

??开头??
你是不是遇到过这种情况:明明程序里用了多线程,但运行起来比单线程还卡?或者线程之间像无头苍蝇一样乱窜,完全不听指挥?其实啊,这都是没搞懂sleep、yield、wait这三个方法的区别惹的祸!今天咱们就用大白话,把这三个最容易让新手翻车的"线程控制三兄弟"扒个底朝天!


一、为什么你的线程总在"装死"?

??场景??:小明写了个抢票程序,结果用户疯狂点击时,后台直接卡成PPT。
??核心问题??:他给每个请求都调用了Thread.sleep(1000),以为能让服务器喘口气,结果反而导致所有线程抱着锁睡觉。

??避坑要点??:

  1. ??sleep像定闹钟赖床??:设定睡1秒就躺1秒,但??死抓着被子(锁)不松手??,其他线程想干活?门都没有!
  2. ??yield像让座的好心人??:主动让出座位(CPU),但可能刚站起来又被自己坐回去了,完全看调度器心情。
  3. ??wait像等外卖的打工人??:不仅放下手头工作(释放锁),还得等外卖电话(notify)才继续干活。

二、三兄弟身份大起底(表格对比)

特征sleepyieldwait
??户口??Thread家Thread家Object家
??锁处理??抱死不放绝不松手立马交钥匙
??叫醒方式??到点自醒随时插队等别人打电话
??使用场景??定时暂停性能调优线程约会

举个栗子:就像三个不同性格的室友——

  • sleep是霸占卫生间的书呆子(拿着锁睡觉)
  • yield是随时让位的老好人(但可能反复横跳)
  • wait是自觉排队的规矩人(释放资源等通知)

三、那些年我们踩过的坑

??坑1:sleep导致死锁??

java复制
synchronized(lock){
    Thread.sleep(5000); // 其他线程5秒内别想用这个锁!
}

后果:就像把唯一厕所钥匙带进梦乡,外面憋急的队友只能干瞪眼。

??坑2:yield的虚假让位??

java复制
while(任务没做完){
    Thread.yield(); // 你以为在谦让,其实可能在摸鱼
}

真相:调度器可能觉得"这孩子真懂事",转头又把CPU塞回你手里。

??坑3:wait忘记带钥匙??

java复制
public void run(){
    obj.wait(); // 报错!没在同步块里
}

血泪史:就像没买票就想进VIP室,直接被保安(JVM)赶出来。


四、灵魂拷问:到底该用哪个?

??Q:我要做定时任务,选谁???
A:无脑选sleep!但记得——如果带着锁睡觉,小心睡醒发现队友全在门口蹲你。

??Q:想提高程序响应速度呢???
A:yield可以试试,但别抱太大希望。就像在食堂窗口谦让,可能让着让着饭菜都凉了。

??Q:线程要互相配合怎么办???
A:必须上wait/notify!就像接力赛交接棒,得等队友伸出手才能传递。


五、小编的实战心得

  1. ??锁和睡眠不可兼得??:带着锁睡觉就像抱着金砖睡大街,不是被抢就是堵路——能用wait就别用sleep!
  2. ??yield不是银弹??:在IO密集场景可能有用,但CPU密集场景可能越让效率越低。
  3. ??wait必备三件套??:synchronized、while循环检查条件、try-catch异常,少一个都是埋雷!

最后说句大实话:多线程就像多人共舞,sleep是独舞暂停,yield是即兴让位,wait才是真正的双人华尔兹。搞不清规则?等着踩脚翻车吧!

搜索