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)本身没有问题,关键还是怎么用,代码的好坏也不在于用了什么语法,而在于是否合理使用了它
觉得有用就点个赞吧! 我是旷野,探索无尽技术
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:为什么有很多女孩变成剩女?
- 下一篇:腾讯的势力有多大?
相关推荐

你 发表评论:
欢迎