本文介绍如何在使用executorservice提交异步任务获取closeable资源时,安全实现带超时的get()调用,并确保即使超时也能自动释放资源,避免泄漏。核心思路是通过共享状态+线程安全协作,让工作线程主动感知超时并执行清理。
在Java并发编程中,Future.get(timeout, unit) 是实现异步任务限时等待的常用方式。但当任务返回一个需显式关闭的资源(如 InputStream、Socket、自定义 CloseableResource)时,单纯超时放弃会导致资源句柄丢失、无法关闭——引发资源泄漏。根本问题在于:主线程放弃了等待,但工作线程仍在运行且无人通知其“结果已作废,立即清理”。
✅ 正确解法:协作式取消 + 自动清理
不能依赖 Future.cancel(true)(它仅中断线程,不保证资源被关闭),而应设计一种任务内建清理意识的机制。推荐采用 AtomicBoolean 标志位 + 封装资源获取逻辑 的模式: