This commit is contained in:
2025-12-11 21:05:04 +08:00
parent ed0eccd0ee
commit d470b2fdb1
22 changed files with 537 additions and 151 deletions

View File

@@ -0,0 +1,82 @@
package com.xscm.modulemain.utils
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledFuture
import java.util.concurrent.TimeUnit
/**
* 单例定时器管理类
* 特性:
* 1. 单例模式,全局唯一实例
* 2. 支持多任务管理通过taskId区分
* 3. 时间到触发回调,支持取消指定/所有定时器
* 4. 线程安全,适配多线程场景
*/
object TimerManager {
// 线程安全的ScheduledExecutorService核心线程数1足够处理定时任务
private val scheduler = Executors.newSingleThreadScheduledExecutor()
// 存储定时任务的Future用于取消任务ConcurrentHashMap保证线程安全
private val taskMap = ConcurrentHashMap<String, ScheduledFuture<*>>()
/**
* 启动一个定时任务
* @param taskId 任务唯一标识(用于后续取消)
* @param delay 延迟时间比如5表示5秒/5分钟取决于unit
* @param unit 时间单位TimeUnit.SECONDS/TimeUnit.MILLISECONDS等
* @param onTimeUp 时间到的回调(默认在后台线程执行)
*/
fun scheduleTimer(
taskId: String,
delay: Long,
unit: TimeUnit,
onTimeUp: () -> Unit
) {
// 先取消同名任务(避免重复创建)
if (taskMap.containsKey(taskId)) {
cancelTimer(taskId)
}
// 提交定时任务
val future = scheduler.schedule({
try {
onTimeUp.invoke() // 执行回调
taskMap.remove(taskId) // 执行完自动移除任务记录
} catch (e: Exception) {
// 捕获回调异常,避免影响定时器线程
println("Timer task $taskId callback error: ${e.message}")
}
}, delay, unit)
// 记录任务Future
taskMap[taskId] = future
}
/**
* 取消指定的定时任务
* @param taskId 任务唯一标识
* @return 是否取消成功true=取消成功/任务已执行false=任务不存在)
*/
fun cancelTimer(taskId: String): Boolean {
val future = taskMap.remove(taskId) ?: return false
// mayInterruptIfRunning是否中断正在执行的任务这里设为false避免强制中断
return future.cancel(false)
}
/**
* 取消所有定时任务
*/
fun cancelAllTimers() {
taskMap.values.forEach { it.cancel(false) }
taskMap.clear()
}
/**
* 销毁定时器(应用退出时调用,释放资源)
*/
fun destroy() {
cancelAllTimers()
scheduler.shutdown() // 关闭线程池
}
}