当前位置:首页 > 每日看点

java代码中写while(true)真的很落后吗?

卡卷网1年前 (2025-01-12)每日看点248

从被黑十年到重获尊重:while(true)的复仇之路

while(true) 不是落后,而是被误解!

为什么大家都觉得while(true)是毒瘤?

// 教科书里的反面教材 while(true) { doSomething(); Thread.sleep(1000); // CPU: 你是要榨干我吗? }

确实,早期很多while(true)的代码都是这么写的:

-容易占用CPU
-可读性差
-难以维护
-不好做异常处理

但实际上,while(true)有它擅长的领域

1. 消息队列消费

// 优雅的消费者实现 @Service public class MessageConsumer { private volatile boolean running = true; @PostConstruct public void start() { new Thread(() -> { while(running) { // 这里用while(true)也完全OK try { Message msg = queue.poll(1, TimeUnit.SECONDS); if (msg != null) { processMessage(msg); } } catch (Exception e) { log.error("处理消息异常", e); } } }).start(); } }

2. 定时任务调度

// 自定义调度器 public class SimpleScheduler { private final ScheduledExecutorService executor; public void schedule() { executor.execute(() -> { while(true) { try { Task task = taskQueue.take(); // 阻塞等待 executeTask(task); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } }); } }

3. 优雅的重试机制

// 带退出机制的重试 public Result retry(Callable<Result> task) { int attempts = 0; while(true) { try { return task.call(); } catch (Exception e) { attempts++; if (attempts >= MAX_RETRIES) { throw new RetryExhaustedException(e); } sleep(getBackoffTime(attempts)); } } }

现代框架里的while(true)

其实很多主流框架里也藏着大量while(true):

1. Netty的事件循环

// Netty NioEventLoop简化版 protected void run() { while(true) { try { select(); // 等待IO事件 processSelectedKeys(); // 处理IO事件 } catch (Throwable t) { handleLoopException(t); } } }

2. Tomcat的请求处理

// Tomcat Poller public void run() { while(true) { try { // Wait for incoming connections events = connector.getSelector().select(); if (events == 0) { continue; } // Process selected keys Iterator<SelectionKey> iterator = connector.getSelector().selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); processKey(key); } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); } } }

但while(true)也有其使用的法则

1. 必须有退出机制

private volatile boolean running = true; public void shutdown() { this.running = false; } public void run() { while(running) { // 不是while(true) // ... } }

2. 合理的等待策略

while(true) { // Bad Thread.sleep(1000); // 固定等待 // Good LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos( backoff.nextBackoff() // 指数退避 )); }

有代替while(true)的吗? 还真有!

如果真的对while(true)有心理阴影,现代框架提供了很多替代方案:

1. Spring的@Scheduled

@Scheduled(fixedDelay = 1000) public void doTask() { // 定时任务逻辑 }

2. RxJava的轮询

Observable.interval(1, TimeUnit.SECONDS) .subscribe(tick -> { // 处理逻辑 });


while(true)本身没有问题,关键还是怎么用,代码的好坏也不在于用了什么语法,而在于是否合理使用了它


觉得有用就点个赞吧! 我是旷野,探索无尽技术

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/8919.html

分享给朋友:

相关文章

学了两个月网络安全,一直未入门怎么办,知乎大佬们给些建议吧?

学了两个月网络安全,一直未入门怎么办,知乎大佬们给些建议吧?

你才学两个月,就想入门,笑不活了,我学了8年了,还被人说是个菜鸟。 我学了这么多的渗透,依然挖不到自己的漏洞。 ailx10:学习CSRF漏洞 ailx10:学习PHP XXE漏洞 ailx10:学习CORS漏洞 ailx10:学习Cl…

推荐几个问卷调查平台?

推荐几个问卷调查平台?

我给大家免费推荐一些市面上不多,且稳定的免费的问卷平台,这个在网上都是能够搜索到的,有的还是世界500钱企业,这里推荐的基本上都是上市的问卷公司了。上面都是可以免费去注册的,对外公开开放的,做完了直接奖励美刀的,不需要兑换卡什么的。 C…

请问什么软件支持看电视直播?

请问什么软件支持看电视直播?

2024年9月6日最新更新:本文列举的 所有看电视直播、或流媒体影视资源点播的软件,我这两天又重新梳理成最新版本,最大程度保证可用性。获取方式见文末图片,或见评论。后续我也将持续更新,文章是旧的软件也会是新的,保证你拿到的都是最新可用版本。…

OZON平台什么产品好卖?

ozon选品的核心重点我不说 你们全网也不见说的这么干的教学了 你信我就按照我说的思路去走 不信的出去买课去 一时间消化不了的先点赞收藏起来 真不中了下载也行 因为最近总有坏人给我使诈 平台已经下了我八个视频了 还都是实操教学不废话的那种…

为什么大家都说手机性能永远超不过PC?

最新的天玑9400牛逼吧,堪称PC级CPU,测试成绩16W功耗能跑9500分,1.8W能跑3000分,GPU也差不多是这个情况。 手机电池一般是4000-5000毫安时,电压3.7V。 也就是说,手机正常满载5W功耗下,这个电池能支持运行4…

网易云音乐上看到过最触动的热评是什么?

网易云音乐上看到过最触动的热评是什么?

1. “昨天晚上洗澡的时候,我忘记拿毛巾了,喊了声妈妈帮我拿下毛巾, 正当我伸出左手准备接毛巾的时候,我愣了一下,又换了右手。” 希望你永远不会听懂这句话, 永远都不要懂。 ——网易云热评《关键词》 2. 小时候跟着父亲去城里卖西瓜,害…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。