卡卷网
当前位置:卡卷网 / 每日看点 / 正文

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

作者:卡卷网发布时间:2025-01-12 18:17浏览数量:81次评论数量:0次

从被黑十年到重获尊重: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)本身没有问题,关键还是怎么用,代码的好坏也不在于用了什么语法,而在于是否合理使用了它


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

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码