TaskBuilder - c7w/FastAsyncWorldedit GitHub Wiki

总览

TaskBuilder 能够创建相继的同步或异步任务的简化版。 https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/util/task/TaskBuilder.java

方法:

  • sync([Runnable|ReturnTask|ReceiveTask|Task]) - 在主线程上执行任务
  • async([Runnable|ReturnTask|ReceiveTask|Task]) - 在主线程外执行任务
  • delay([int|DelayedTask]) - 延迟几个游戏刻,然后再进行下个任务
  • syncParallel([Runnable|ReturnTask|ReceiveTask|Task]) - 执行所有并行的下个 syncParallel 任务
  • asyncParallel([Runnable|ReturnTask|ReceiveTask|Task]) - 执行所有并行的下个 asyncParallel 任务
  • syncWhenFree([SplitTask|ReturnTask|ReceiveTask|Task]) - 在主线程空闲时执行任务
  • abortIfTrue(Task<Boolean,Object>) - 如果为 true 停止所有进程
  • build() - 开始执行
  • buildAsync() - 从某一异步线程开始执行

多任务

输出数字 6

new TaskBuilder()
.async((ReturnTask<Integer>) () -> 5 + 1)
.sync((ReceiveTask) input -> System.out.println(input))
.build();

SplitTask 的示例

分离一个任务并且在主线程空闲时运行它。

// 在现实中你需要使用 EditSession, AsyncWorld,与 FaweQueue 的其中之一作为代替。
// 但这仅仅是你怎么使用 FAWE API 分离一个任务的示例

final World world = Bukkit.getWorld("world");
new TaskBuilder()
// 执行任务会被分成多个 20ms 的任务
.syncWhenFree(new TaskBuilder.SplitTask(20) {
    @Override
    public Object exec(Object previous) {
        for (int x = 0; x < 100; x++) {
            for (int y = 0; y < 100; y++) {
                for (int z = 0; z < 100; z++) {
                    world.getBlockAt(x, y, z).setType(Material.STONE);
                    // FAWE 会使用这个点来分离任务
                    // 你可以设置多个分离点
                    split();
                }
            }
        }
        // 我们不需要对于下个任务的结果
        return null;
    }
})
.build();

任务元数据

TaskBuilder 继承 Metadatable,所以你可以使用它储存临时数据: https://github.com/boy0001/FastAsyncWorldedit/blob/master/core/src/main/java/com/boydti/fawe/object/Metadatable.java

final TaskBuilder task = new TaskBuilder();
task.sync(() -> {
    task.setMeta("blah", 5);
    return task.<Integer>getMeta("blah") + 56;
});
⚠️ **GitHub.com Fallback** ⚠️