跳到主要内容

使用调度器

Velocity 调度器让你可以决定插件任务何时以及如何运行,允许对执行进行精细控制。 在 Velocity 中,没有主线程。所有使用 Velocity 调度器运行的任务都是异步运行的。

运行延迟任务

所有调度工作都通过使用从 Scheduler 返回的 TaskBuilder 来完成。 这个流畅的构建器可以链式调用来配置调度的细节。

server.getScheduler()
.buildTask(plugin, () -> {
// 在这里处理
})
.delay(2L, TimeUnit.SECONDS)
.schedule();

在这里,我们正在调度一个 2 秒后运行的任务。Velocity 需要你的插件的实例,上面的 plugin。 如果你从主插件类调度任务,你可以简单地使用 this

时间参数被指定为一个 long 和一个 TimeUnit。 使用时间单位使延迟任务的调度更易读并允许更高的精度。 2L, TimeUnit.SECONDS 比模糊的 2000L 更容易理解。

你也可以使用 Duration 来指定时间参数, 例如:Duration.ofSeconds(5L)

运行重复任务

创建重复任务与延迟任务类似,但你还必须指定 repeat(long, TimeUnit)。 这个例子将每 5 分钟重复一次。

server.getScheduler()
.buildTask(plugin, () -> {
// 在这里处理
})
.repeat(5L, TimeUnit.MINUTES)
.schedule();

立即运行任务

任务使用调度器的缓存线程池进行所有执行,该线程池重用线程。要利用这个线程池来运行立即执行的异步任务, 只需省略调用 TaskBuilderdelayrepeat 方法。

取消

schedule() 方法返回一个 ScheduledTask, 然后可以通过 cancel() 方法取消相关的任务。任务不能被取消取消。

此外,task.status() 返回任务的当前状态。

ScheduledTask task = server.getScheduler()
.buildTask(plugin, () -> {
// 在这里处理
})
.repeat(5L, TimeUnit.MINUTES)
.schedule();
// ...
task.cancel();
// ...
System.out.println(task.status());

你也可以使用 Consumer<ScheduledTask> 调度_自取消_任务。

AtomicInteger integer = new AtomicInteger(0);

ScheduledTask task = server.getScheduler()
.buildTask(plugin, (selfTask) -> {
// 在这里处理,例如...
if (integer.addAndGet(1) > 10) {
selfTask.cancel();
}
})
.repeat(Duration.ofSeconds(4L))
.schedule();

获取插件的任务

你可以使用 tasksByPlugin(Object) 获取插件调度的所有任务。

Collection<ScheduledTask> tasks = server.getScheduler().tasksByPlugin(plugin);
// 然后你可以控制它们,例如,取消插件调度的所有任务
for (ScheduledTask task : tasks) {
task.cancel();
}