使用调度器
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();
立即运行任务
任务使用调度器的缓存线程池进行所有执行,该线程池重用线程。要利用这个线程池来运行立即执行的异步任务,
只需省略调用 TaskBuilder 的 delay 和 repeat 方法。
取消
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();
}