当前位置:首页 > 每日看点 > 正文内容

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

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

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

分享给朋友:

相关文章

感觉手机配置都差不多,为什么有的手机能卖2k-3k,而有的手机却能卖到6k-8k?

感觉手机配置都差不多,为什么有的手机能卖2k-3k,而有的手机却能卖到6k-8k?

与所有的商品一样,手机的价格,也是由它的成本所决定的。虽然看起来3000元的手机和6000的手机配置差不多,甚至处理器都可能是同一个,但在很多大家容易忽略的地方,决定了两者价格的不同:例如手机的外观,塑料的机身,与素皮机身和玻璃机身就完全不...

抖音和快手最大的区别是什么?

1、目标人群定位不同抖音:一二线城市,占比52%,大专学历以上,女性偏多。抖音以年轻群体居多。快手:三四线城市,占比64%,高中学历以下,男女更均衡。快手所覆盖的年龄段范围更广。2、内容创作的形式和深度不同抖音:偏深层,内容的装饰及表达更高...

为什么雷军身上没有酒色财气?

武大建校130周年时,雷军向母校个人捐款13亿。在2023年8月14日晚上七点,雷总在国家会议中心举行的进行第四次年度演讲「成长」:全篇都在谈成长、梦想,这么多年了,始终做到了知行合一,我相信酒色财气可能真不是他所追求的,一直追求的就像他演...

想学习Linux下的ELF文件有什么好书推荐吗?

想学习Linux下的ELF文件有什么好书推荐吗?

大家好,这里是物联网心球。 今天我们来聊聊ELF文件,了解一下Linux如何创建进程以及ELF文件如何转变成Linux进程?1.什么是ELF文件? ELF(Executable and Linkable Format)文...

你见过哪些有趣的偏微分方程组?

你见过哪些有趣的偏微分方程组?

说说我一直在做的一个偏微分方程系统吧,该模型为生物领域的趋化性(chemotaxis)模型,也叫Keller-Segel模型,由该二人于1971年左右提出,用于刻画细胞或者细菌的趋化机制。解释一下趋化性(chemotaxis):趋化性是指单...

有哪些好玩到爆的小网站?推荐?

有哪些好玩到爆的小网站?推荐?

1、Poki 免费在线游戏https://poki.com/zh免费在线小游戏网站。上千款在线游戏,完全免费,无需登录,打开就能玩。2、http://YORG.iohttps://yorg.io超耐玩的塔防游戏。搭建自己的防御基地、开采资源...

发表评论

访客

看不清,换一张

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