如何通过while循环结合Thread.sleep实现带延时轮询检查功能?
- 内容介绍
- 相关推荐
本文共计910个文字,预计阅读时间需要4分钟。
在主线程(例如Android的UI线程或Swing的事件分发线程)中直接使用以下代码会导致整个界面冻结、按钮无响应,甚至可能导致应用程序无响应(ANR):
正确做法是把轮询逻辑放到后台线程里,同时注意异常捕获和退出控制:
-
Thread.sleep必须包裹在try-catch(InterruptedException)中,否则编译不通过; - 轮询条件不能只靠
while (flag),要配合volatile修饰的布尔变量,否则 JVM 可能因指令重排或缓存导致子线程永远看不到主控线程改写的值; - 别用
while (true)硬循环加break,容易漏掉中断响应——应优先检查Thread.currentThread().isInterrupted()。
怎么安全启动并停止一个带 sleep 的轮询线程
典型场景:等待某个远程资源就绪(如文件生成、API 返回状态为 "done"),每 2 秒查一次,最多等 30 秒。关键不是“怎么睡”,而是“怎么可控地启停”。
本文共计910个文字,预计阅读时间需要4分钟。
在主线程(例如Android的UI线程或Swing的事件分发线程)中直接使用以下代码会导致整个界面冻结、按钮无响应,甚至可能导致应用程序无响应(ANR):
正确做法是把轮询逻辑放到后台线程里,同时注意异常捕获和退出控制:
-
Thread.sleep必须包裹在try-catch(InterruptedException)中,否则编译不通过; - 轮询条件不能只靠
while (flag),要配合volatile修饰的布尔变量,否则 JVM 可能因指令重排或缓存导致子线程永远看不到主控线程改写的值; - 别用
while (true)硬循环加break,容易漏掉中断响应——应优先检查Thread.currentThread().isInterrupted()。
怎么安全启动并停止一个带 sleep 的轮询线程
典型场景:等待某个远程资源就绪(如文件生成、API 返回状态为 "done"),每 2 秒查一次,最多等 30 秒。关键不是“怎么睡”,而是“怎么可控地启停”。

