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

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

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

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

分享给朋友:

相关文章

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

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

拼多多,怎么就成为了年轻人的「赛博菜市场」?

拼多多,怎么就成为了年轻人的「赛博菜市场」?

可惜你不在拼多多买水果蔬菜,很难一句话跟你解释,我只能笨拙的用经历来慢慢讲。我们公司有微波炉,同事们几乎都是自己带饭来上班,便当荤素搭配、水果零食;都是好看又好吃。我自己本来就不喜欢外卖,当然也加入了带饭大军: 直到某一天深夜我闲着无聊刷了...

为什么小公司留不住人?

为什么小公司留不住人?

我估计,整个知乎,可能没有比我公司再小得了,。。正对面就是我唯一的一个员工的工位。为啥留不住人。因为那些留不住人的老板,太拿自己当回事。大公司靠制度。小公司靠人情。我这儿的业务,因为全都是线上,所以员工来不来坐班都不重要。天太热可以不来,下...

为什么张雪峰什么专业都懂?

他不懂专业,他懂的是就业。我记得有个老哥,家里条件不好,母亲吸血。想脱离家庭张雪峰眼睛一亮就说这是个学土木的好苗子。作为土木人我可知道他说的太对了,这种人学土木毕业进中建中铁,直接给你拉非洲看大鳄鱼呲牙。工资不低还能脱离家庭,可不是个学土木...

如何评价小米14这款手机?

如何评价小米14这款手机?

本来小米 14 和 14 Pro 是打算放一起拆的,但是因为时间关系,实在凑不到一起了。所以今天给大家补一篇详细的图文拆解,基本信息都有了,如有遗漏可以在评论区留言。双卡上下放置,卡托材质为金属 + 塑料,内侧有防尘防水的胶圈。后盖为玻璃材...

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

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

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

发表评论

访客

看不清,换一张

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