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

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

卡卷网2年前 (2025-01-12)每日看点282

从被黑十年到重获尊重: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

分享给朋友:

相关文章

为什么我们一直在给B站充大会员但B站却一直处于亏损状态?

我讲一下离谱的真相吧,欢迎喷我。 很多人都觉得B站在赶走人才,赶走优秀的长视频创作者,也觉得知乎在这么做,是没错的。 确实在这么做。而原因很简单。 只有影响力很大的KOL才有商业价值。 (KOL是指“关键意见领袖”)而你说你是人才? 对不起…

为什么有人觉得华为mate60只值2000?

为什么有人觉得华为mate60只值2000?

你以为买Mate60的人真的傻?真的那么爱国? 国庆前,我家那傻子加价800多买了一台Mate60,当时还被我骂他是傻子。 可是他说一回到公司就被老板同事朋友看到,拿去反复查看,都在惊叹他这么快就买到新机。 跟亲戚朋友聚会,别人一看就知道他…

天涯神帖,第一神帖是什么?

天涯神帖,第一神帖是什么?

一些个人觉得比较经典的天涯神贴(更新进去了): 话说1999年那会儿,中国的互联网还是个小婴儿,BAT三巨头都还在穿开裆裤呢,天涯社区就已经悄然诞生了。 时光飞逝,到了2007年,这小小社区竟然已经吸引了超过20…

怎样拥有一台最便宜的服务器?

怎样拥有一台最便宜的服务器?

内容提示:主打一个 DIY + 极限白嫖 =) 某宝花10块买一个“随身WiFi”,刷入Ubuntu,用SSH远程连接,但是记得一定要把外壳撬掉然后粘个散热器(哪怕是白萝卜也彳亍),否则会过热 详细去酷安社区搜“随身WiFi” ======…

本专业是电气的,请问入门plc 必须要从电工接线开始吗,我怕被公司骗了,想请教各位?

本专业是电气的,请问入门plc 必须要从电工接线开始吗,我怕被公司骗了,想请教各位?

开关接线图 PART 01一开单控开关接线图 二三开连体单控开关接线图 四开连体单控开关接线图 一开五孔单控插座接线图 二开五孔单控插座接线图 一开双控开关接线图 二三开单控开关接线图 四开单控开关接线图 一…

据报道称“浏览器内核有上千万行代码”,浏览器内核真的很复杂吗?

据报道称“浏览器内核有上千万行代码”,浏览器内核真的很复杂吗?

极度复杂,称之为IT界的火星计划都不为过。 连微软都没有能力再维护一套“跟得上最新标准”的内核而使用Chromium内核。准确地说,是指没有把握在有限的资源内(远超出其他小厂),纯粹通过自身的力量,开发出一套比Chromium更具有竞争力和…

发表评论

访客

看不清,换一张

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