当使用 `future.get(timeout)` 获取需手动关闭的资源时,超时会导致资源句柄丢失、无法释放。本文介绍一种线程安全的“带清理语义的 future”模式,通过共享状态与原子标记实现超时自动关闭,避免资源泄漏。
在 Java 并发编程中,Future 是异步任务结果的抽象,但其原生 API 缺乏对“超时后自动清理”的支持。如题所述:若 getCloseableResource() 返回一个 CloseableResource(例如数据库连接、文件流或 HTTP 客户端响应体),而调用方因超时放弃等待,该资源将永远滞留在后台线程中,既无法被业务逻辑关闭,也无法被 GC 回收(尤其当持有底层 socket 或文件描述符时),造成严重资源泄漏。
✅ 推荐方案:原子状态驱动的自清理 Future
核心思想是将“是否已被放弃”这一决策权交给执行线程本身,而非依赖外部中断(future.cancel(true) 对阻塞 I/O 通常无效)。我们通过一个线程安全的共享状态(如 AtomicBoolean)协调主调线程与工作线程: