AsteroidScheduler:调度工具
Folia 兼容的线程调度工具集
AsteroidScheduler
- 调度器桥接工具,封装 Asteroid
FoliaScheduler,提供 Spigot / Paper / Folia 三平台兼容的任务调度。 - 位于
priv.seventeen.artist.arcartx.nms.AsteroidScheduler,是一个 Kotlinobject单例。 - 所有一次性任务和周期任务的句柄都会被内部登记,可通过
cancelAll()在插件卸载时统一取消,避免 Folia 下任务泄漏。 - 大部分方法都提供了
Plugin的 Kotlin 扩展形式(如plugin.runTask { ... }),在 Java 中请使用静态调用形式(如AsteroidScheduler.runTask(plugin, task))。
调度方法的返回值均为 Any?(Java 中为 Object),代表底层任务句柄,可能为 null。该句柄可传给 cancelTask(handle) 用于取消任务。
平台检测
isPaper()
- 判断当前服务端是否为 Paper(或其衍生版)
- 参数:无
- 返回值:boolean
- 调用示例
isFolia()
- 判断当前服务端是否为 Folia
- 参数:无
- 返回值:boolean
- 调用示例
isSpigot()
- 判断当前服务端是否为原版 Spigot
- 参数:无
- 返回值:boolean
- 调用示例
同步调度
runTask(plugin, task)
- 在主线程(Folia 下为全局区域线程)执行一次性任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
runTaskLater(plugin, task, delayTicks)
- 在主线程延迟执行一次性任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务delayTicks: long — 延迟 tick 数(20 tick = 1 秒)
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
runTaskTimer(plugin, task, delayTicks, periodTicks)
- 在主线程按周期重复执行任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务delayTicks: long — 首次执行前的延迟 tick 数periodTicks: long — 每次执行的间隔 tick 数
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
异步调度
runAsync(plugin, task)
- 在异步线程执行一次性任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
runAsyncLater(plugin, task, delayTicks)
- 在异步线程延迟执行一次性任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务delayTicks: long — 延迟 tick 数
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
runAsyncTimer(plugin, task, delayTicks, periodTicks)
- 在异步线程按周期重复执行任务
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务delayTicks: long — 首次执行前的延迟 tick 数periodTicks: long — 每次执行的间隔 tick 数
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
区域安全调度(Folia)
runEntityTask(plugin, entity, task)
- 在指定实体所属的区域线程上执行任务,保证 Folia 下对该实体的操作线程安全
- 参数:
plugin: Plugin — 插件实例entity: Entity — 目标实体task: Runnable — 要执行的任务
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
runLocationTask(plugin, location, task)
- 在指定坐标所属的区域线程上执行任务,保证 Folia 下对该区域的操作线程安全
- 参数:
plugin: Plugin — 插件实例location: Location — 目标坐标task: Runnable — 要执行的任务
- 返回值:
Object(Any?)— 任务句柄,可能为 null - 调用示例
任务取消
cancelTask(handle)
- 取消指定句柄对应的任务,并从内部登记表中移除
- 参数:
handle: Object(Any?)— 任务句柄,可为 null - 返回值:无
- 调用示例
cancelAll()
- 取消所有经本调度器登记且仍在追踪的任务(常用于
onDisable)
- 参数:无
- 返回值:无
- 调用示例
线程保障
ensureMainThread(plugin, task)
- 确保任务在主线程执行。非 Folia 下若当前已在主线程则直接执行,否则调度到主线程;Folia 下始终通过
runTask调度
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务
- 返回值:无
- 调用示例
ensureAsyncThread(plugin, task)
- 确保任务在异步线程执行。若当前已在主线程则调度到异步线程,否则直接执行
- 参数:
plugin: Plugin — 插件实例task: Runnable — 要执行的任务
- 返回值:无
- 调用示例
Plugin 扩展写法(Kotlin)
以下方法均为 Plugin 的 Kotlin 扩展函数,等价于把 plugin 作为第一个参数传入对应的静态方法。仅在 Kotlin 中可用此简写,Java 请直接使用上文的静态调用形式。
plugin.runTask(task)plugin.runTaskLater(task, delayTicks)plugin.runTaskTimer(task, delayTicks, periodTicks)plugin.runAsync(task)plugin.runAsyncLater(task, delayTicks)plugin.runAsyncTimer(task, delayTicks, periodTicks)plugin.runEntityTask(entity, task)plugin.runLocationTask(location, task)plugin.ensureMainThread(task)plugin.ensureAsyncThread(task)
