任务1
This commit is contained in:
@@ -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() // 关闭线程池
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user