java.lang.Object
com.ultikits.ultitools.abstracts.gui.declarative.engine.GuiScheduler

public class GuiScheduler extends Object
GuiScheduler 负责确保所有 GUI 操作都在 Bukkit 主线程执行。

它提供以下功能:

  • 检查当前是否在主线程
  • 将任务调度到主线程执行
  • 帧调度:合并短时间内的多次更新请求
  • 防止重复调度

帧调度机制:

 时间轴:
 |----16ms----|----16ms----|----16ms----|
    ↑ ↑           ↑
   setState     实际执行重建
    ↑
   setState (合并到同一帧)
 
Since:
6.2.0
Version:
1.0.0
Author:
UltiTools Team
  • 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

      private final AtomicBoolean isScheduled
    • pendingTasks

      private final ConcurrentLinkedQueue<Runnable> 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

      public void runOnMainThread(@NotNull @NotNull Runnable task)
      确保在主线程执行任务。

      如果当前在主线程,立即执行。 否则,调度到主线程执行。

      Parameters:
      task - 要执行的任务
    • scheduleFrame

      public void scheduleFrame(@NotNull @NotNull Runnable frameTask)
      调度一个帧任务。

      这个方法实现了帧合并机制: 在同一帧窗口期内的多次调用只会触发一次实际执行。

      Parameters:
      frameTask - 帧任务
    • executeFrame

      private void executeFrame()
      执行所有挂起的帧任务。
    • flush

      public void flush()
      立即执行所有挂起的任务(阻塞直到完成)。

      注意: 这个方法只能在主线程调用。

      Throws:
      IllegalStateException - 如果不在主线程
    • cancelAll

      public void cancelAll()
      取消所有挂起的任务。