Class GuiScheduler
java.lang.Object
com.ultikits.ultitools.abstracts.gui.declarative.engine.GuiScheduler
GuiScheduler 负责确保所有 GUI 操作都在 Bukkit 主线程执行。
它提供以下功能:
- 检查当前是否在主线程
- 将任务调度到主线程执行
- 帧调度:合并短时间内的多次更新请求
- 防止重复调度
帧调度机制:
时间轴:
|----16ms----|----16ms----|----16ms----|
↑ ↑ ↑
setState 实际执行重建
↑
setState (合并到同一帧)
- Since:
- 6.2.0
- Version:
- 1.0.0
- Author:
- UltiTools Team
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final long默认帧间隔(毫秒)。 Minecraft 默认 tick 是 50ms,但 GUI 更新可以更频繁。private final longprivate final AtomicBooleanprivate longprivate final ConcurrentLinkedQueue<Runnable> private final org.bukkit.plugin.Plugin -
Constructor Summary
ConstructorsConstructorDescription使用默认插件实例创建 GuiScheduler。GuiScheduler(@NotNull org.bukkit.plugin.Plugin plugin) 创建 GuiScheduler。GuiScheduler(@NotNull org.bukkit.plugin.Plugin plugin, long frameIntervalMs) 创建 GuiScheduler,指定帧间隔。 -
Method Summary
Modifier and TypeMethodDescriptionvoid取消所有挂起的任务。private void执行所有挂起的帧任务。voidflush()立即执行所有挂起的任务(阻塞直到完成)。boolean检查当前是否在主线程。voidrunOnMainThread(@NotNull Runnable task) 确保在主线程执行任务。voidscheduleFrame(@NotNull Runnable frameTask) 调度一个帧任务。
-
Field Details
-
DEFAULT_FRAME_INTERVAL_MS
private static final long DEFAULT_FRAME_INTERVAL_MS默认帧间隔(毫秒)。 Minecraft 默认 tick 是 50ms,但 GUI 更新可以更频繁。- See Also:
-
plugin
private final org.bukkit.plugin.Plugin plugin -
frameIntervalMs
private final long frameIntervalMs -
isScheduled
-
pendingTasks
-
lastFrameTime
private long lastFrameTime
-
-
Constructor Details
-
GuiScheduler
public GuiScheduler()使用默认插件实例创建 GuiScheduler。 -
GuiScheduler
public GuiScheduler(@NotNull @NotNull org.bukkit.plugin.Plugin plugin) 创建 GuiScheduler。- Parameters:
plugin- 插件实例
-
GuiScheduler
public GuiScheduler(@NotNull @NotNull org.bukkit.plugin.Plugin plugin, long frameIntervalMs) 创建 GuiScheduler,指定帧间隔。- Parameters:
plugin- 插件实例frameIntervalMs- 帧间隔(毫秒)
-
-
Method Details
-
isOnMainThread
public boolean isOnMainThread()检查当前是否在主线程。- Returns:
- 如果在主线程则返回 true
-
runOnMainThread
确保在主线程执行任务。如果当前在主线程,立即执行。 否则,调度到主线程执行。
- Parameters:
task- 要执行的任务
-
scheduleFrame
调度一个帧任务。这个方法实现了帧合并机制: 在同一帧窗口期内的多次调用只会触发一次实际执行。
- Parameters:
frameTask- 帧任务
-
executeFrame
private void executeFrame()执行所有挂起的帧任务。 -
flush
public void flush()立即执行所有挂起的任务(阻塞直到完成)。注意: 这个方法只能在主线程调用。
- Throws:
IllegalStateException- 如果不在主线程
-
cancelAll
public void cancelAll()取消所有挂起的任务。
-