网易首页 > 网易号 > 正文 申请入驻

线程只等了 1 秒,整个池子为什么全堵住了?

0
分享至

一个「只等 1 秒」的动作,怎么就把池子堵死了病根:这 1 秒里,线程在占着工位发呆JDK 9 塞给我们一个「定时闹钟」闹钟背后是谁在计时同一场实验,两种写法跑出来的差距能直接抄进项目的重试工具进阶一档:指数退避只改一个地方五个最容易踩的坑

线上有个接口偶尔超时,翻代码会发现里面写了段重试:调用第三方失败,就等 1 秒再试一次。看起来人畜无害——不就是等 1 秒吗。可正是这 1 秒,在并发一上来之后,能把整个线程池拖进泥里。

先把那段代码摆出来,它太常见了:



假设线程池里一共 4 个线程,同时来了 4 个请求,全都赶上支付方抖动失败。接下来发生的事情是这样的:



注意,这里没有死锁,也没有慢查询。线程什么都没干,但它占着工位不放——这才是最要命的地方。

Thread.sleep 的语义是「让当前线程暂停执行」。暂停的意思是它不消耗 CPU,但它也没有被还回线程池,池子记着的账上,这个线程仍然在执行任务。于是等待的这 1 秒,等于从池子里白扣掉一个名额。

我们真正想要的其实是另一种画面:等待期间,线程先交回去,让别人用;时间到了,再捞一个线程回来接着干。



差别就在这一念之间:一边是「睡着等」,一边是「放下活、定个闹钟、走人」。JDK 9 之后,第二种写法不用自己去造轮子,标准库里已经有一个现成的闹钟。

这个闹钟叫delayedExecutor,是 CompletableFuture 上的一个静态方法:

一句话说清它的作用:返回一个特殊的 Executor,交给它的任务不会立刻跑,而是等指定时间之后才跑。

要理解它,得先知道 Executor 原本长什么样。它其实小得可怜,只有一个方法:



平时我们见到的都是「提交即执行」的实现,而这个闹钟版本是第三种:



它一共三个重载版本,覆盖了绝大多数用法:



最短的一个例子是这样:



跑出来的结果,重点看时间戳:



第三行那个线程名值得记住:延迟到期后,任务是被丢进公共池执行的,不是主线程,也不是你原来那个池。

很多人第一次看到这里会犯嘀咕:既然说「零额外线程占用」,那到底是谁在掐表?

答案是JDK 内部一个专门的守护线程(Delayer),它不占你的业务线程池,只负责一件事——计时。时间到了,它再把任务推给你指定的执行器:



所以那句「零额外线程占用」是有前提的:不占的是你的用户线程池。等待期间,你的池子一个线程都没被拖住,可以照常接单。

光讲道理没意思,直接做对照实验。场景:一个只有 1 个线程的线程池,塞进两个都要重试的任务,前几次一律失败、后面才成功。

先看阻塞版:



任务 B 硬生生等了 3 秒才等到第一次进场机会。现在换非阻塞版,核心改动只有一处——把 sleep 换成「定个闹钟再回来」:



同样 1 个线程、同样的失败次数,两种写法的账完全不一样:



这里有个写法上的小机关值得点一句:runAsync(() -> {}, …) 里的空 lambda 是故意的。我们不需要它做事,只需要借用它的「延迟」效果,真正的活儿放在 whenComplete 里,等 1 秒后再提交回线程池。

上面那版写起来还是有点散。工程里更常见的做法是封装成一个通用工具:创建一个空的 CompletableFuture 当「承诺」,失败就定闹钟、递归再来,成功或超限就把承诺兑现或作废。



调用端一句就够了,retryAsync 返回的还是个 CompletableFuture,可以继续挂 thenApply、allOf 这些操作:



整个链路的时间轴摊开看很清爽:提交任务 → 失败 → 定闹钟交还线程 → 到点 → 再提交。中间那段等待,线程池是自由的。

真实世界的服务抖动,往往不是等固定 1 秒就能好。更稳的做法是让等待时间逐次翻倍——100ms、200ms、400ms、800ms,也就是常说的指数退避。用上面这套骨架,改动小得惊人:



比起一上来就猛敲对方接口,这种「越等越久」的节奏对下游更友好,也更符合服务恢复的真实规律。如果这套写法是给自己项目用的,还可以顺手加上重试次数上限和熔断,别让它无限拖下去。

这个方法本身不复杂,坑基本都在用法上。挑五个最常见的:

  • 只创建不提交——单独写一句 delayedExecutor(1, SECONDS) 是没有任何效果的,它必须配合 runAsync / supplyAsync 使用,任务才会真的被排进去。
  • 该用 runAsync 却用了 supplyAsync——supplyAsync 要求 lambda 有返回值,没有 return 会直接编译不过;不需要返回值就用 runAsync。
  • 以为它会中断正在跑的任务——它只是个定时器,不取消、不打断任何已经在执行的任务,别把「延迟执行」理解成「延迟取消」。
  • 延迟回调里又去 get() 阻塞——好不容易把线程放回去了,回调里一发 get() 又堵上,等于白折腾。链式操作请继续用 thenCompose 之类的异步写法。
  • 不持有返回的 Future——主线程如果先退出,JVM 就关了,延迟任务根本没机会跑。至少把 Future 接住,必要时 get() 或 join() 等一下。

反过来,它也有明确的短板——只做「相对延迟」,不做「绝对时刻」,而且只延迟一次,不自动重复。下面这些需求,请换工具:



一句话给这个闹钟定位:它擅长「稍后再说」,不擅长「按时打卡」。

回到开头那个超时接口。同样的重试逻辑,把 sleep 换成 delayedExecutor,线程池就再也不会因为「等待」而排队了。这种改动的性价比很高——改一处,救一整池。

你在项目里是怎么写重试的?有没有被人吐槽过「sleep 太粗暴」?或者踩过 delayedExecutor 的什么坑?评论区说说,我挑几个有意思的展开聊~

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
演员张佳宁连续两月被拍到挺孕肚现身,本人及工作室均未正面回应;此前表示结婚会公开,受父母婚姻影响称坚决不会离婚,未来生两个孩子

演员张佳宁连续两月被拍到挺孕肚现身,本人及工作室均未正面回应;此前表示结婚会公开,受父母婚姻影响称坚决不会离婚,未来生两个孩子

台州交通广播
2026-10-17 12:49:57
重磅!教育部要求辅导员与学生“同吃同住同生活”:政策想让辅导员“住进学生心里”,可住得近就等于心更近吗?

重磅!教育部要求辅导员与学生“同吃同住同生活”:政策想让辅导员“住进学生心里”,可住得近就等于心更近吗?

学术眺望
2026-10-17 21:40:03
多部门介入“母子衣衫不整”事件!

多部门介入“母子衣衫不整”事件!

新动察
2026-10-16 11:00:05
凌晨一则不起眼消息,搅动全球市场,油价飙升美股跳水

凌晨一则不起眼消息,搅动全球市场,油价飙升美股跳水

魏家东
2026-10-17 10:59:08
秦主任跳舞为什么会爆火?

秦主任跳舞为什么会爆火?

廖保平
2026-10-16 08:40:35
这11个字,我只读到一半就卡住了!能从头读到尾的,您是真有门道——草字连成片,到底从哪儿断、到哪儿收?

这11个字,我只读到一半就卡住了!能从头读到尾的,您是真有门道——草字连成片,到底从哪儿断、到哪儿收?

书画相约
2026-10-18 07:42:56
卸任3年后被查!从国务院津贴专家到“阶下囚”:象牙塔里的“学官”腐败,寒了谁的心?

卸任3年后被查!从国务院津贴专家到“阶下囚”:象牙塔里的“学官”腐败,寒了谁的心?

教师吧
2026-10-17 13:40:30
有没有发现,身边有很多60、70后,银行里存有上百万,也有退休保障,却不舍得花钱,甚至一杯奶茶都没喝过,就知道存钱

有没有发现,身边有很多60、70后,银行里存有上百万,也有退休保障,却不舍得花钱,甚至一杯奶茶都没喝过,就知道存钱

犀利强哥
2026-10-18 07:00:00
人类首次!日本10月20日发射探测器登陆火星卫星并采样 5年后带回10克土

人类首次!日本10月20日发射探测器登陆火星卫星并采样 5年后带回10克土

快科技
2026-10-16 16:18:18
杜兰特回怼太阳老板:不用付我天价去别队打球

杜兰特回怼太阳老板:不用付我天价去别队打球

甜度百分百21
2026-10-18 10:14:17
60岁刘嘉玲晒秋日恩爱照:带着梁朝伟一起晨跑,全身大汗

60岁刘嘉玲晒秋日恩爱照:带着梁朝伟一起晨跑,全身大汗

小方说跑步
2026-10-18 10:00:03
韩国忧心忡忡,好日子可能就到2029年!马斯克直言:中国将在2028年生产大量内存

韩国忧心忡忡,好日子可能就到2029年!马斯克直言:中国将在2028年生产大量内存

起点财经
2026-10-17 12:00:31
佩莱格里尼:无法理解裁判的判罚;红牌让比赛失去平衡

佩莱格里尼:无法理解裁判的判罚;红牌让比赛失去平衡

懂球帝
2026-10-18 03:31:05
交1000元灵活就业社保,仅400元入个人账户

交1000元灵活就业社保,仅400元入个人账户

城事堂
2026-10-17 09:09:08
“李然于心”博主爆料北理工裴某近况:其丈夫辞职、裴某朋友圈签名被改

“李然于心”博主爆料北理工裴某近况:其丈夫辞职、裴某朋友圈签名被改

小徐讲八卦
2026-10-18 07:27:47
1换1!湖人火箭交易方案,各取所需,皆大欢喜

1换1!湖人火箭交易方案,各取所需,皆大欢喜

球毛鬼胎
2026-10-17 18:19:25
雷佳音夫妇看网球被偶遇,卷发配眼镜发福严重!网友:撞脸刘震云

雷佳音夫妇看网球被偶遇,卷发配眼镜发福严重!网友:撞脸刘震云

娱乐团长
2026-10-17 12:59:55
上海徐浦大桥发生惨烈车祸,变道致多车相撞有死伤!监控画面曝出

上海徐浦大桥发生惨烈车祸,变道致多车相撞有死伤!监控画面曝出

胡侃社会百态
2026-10-17 18:38:26
拖欠员工345万,却砸钱送女儿韩国出道:用打工人血汗钱给女儿铺星路

拖欠员工345万,却砸钱送女儿韩国出道:用打工人血汗钱给女儿铺星路

城事堂
2026-10-17 20:43:15
刚刚,Anthropic公开4年后的世界!造AI只剩5%留给人

刚刚,Anthropic公开4年后的世界!造AI只剩5%留给人

新智元
2026-10-17 21:25:45
2026-10-18 10:40:49
千纸鹤安安
千纸鹤安安
大自然的搬运工
170文章数 3关注度
往期回顾 全部

科技要闻

王江舟院士:6G到底是不是骗局 是不是收割

头条要闻

牛弹琴:法国又"燃烧"了 整个国家地图上到处都在冒烟

头条要闻

牛弹琴:法国又"燃烧"了 整个国家地图上到处都在冒烟

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

曝郭麒麟与25岁知名女星已经结婚,女方回应关系

财经要闻

马斯克:美债问题只能靠AI和机器人解决

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

艺术
家居
教育
手机
数码

艺术要闻

14位国外画家的风景油画

家居要闻

2026建博会(广州) 公装联探展交流活动

教育要闻

样本|区域弘扬教育家精神的广州探索

手机要闻

魅族22手机推送Flyme AIOS 12.7.0.0A稳定版升级,更新「超级Aicy」助手等功能

数码要闻

极夜带来7.3L迷你工作站DeskOne W2,支持第12~14代英特尔桌面处理器

无障碍浏览 进入关怀版