首页 > 解决方案 > BukkitRunnable 的返回值

问题描述

我使用 BukkitRunnable 向地图异步添加值,然后我想返回地图。

    public Map<String, Object> test() {
    final Map<String, Object> testMap = new HashMap<>();

    new BukkitRunnable() {
        @Override
        public void run() {
            testMap.put("A", 1);
            testMap.put("B", 2);
        }
    }.runTaskAsynchronously(bridge);

    return testMap;
}

如果我想使用这张地图,它将永远是空的。在将值添加到地图之前返回它,因为我将它们添加到另一个线程中。

我真的想使用 BukkitRunnable 而不是 Future。我怎样才能做到这一点?我需要延迟归还地图,或者更好的是,以某种方式从 BukkitRunnable 归还地图。

标签: javaminecraftbukkit

解决方案


问题是Map将直接返回,但任务将异步运行,因此您将得到一个空Map返回。所以你应该Consumer在方法中添加一个来获取异步结果。

尝试这个:

public void test(Consumer<Map<String, Object>> callback) {
    final Map<String, Object> yourMap = new HashMap<>();
    new BukkitRunnable() {
        @Override
        public void run() {
            yourMap.put("A", something);
            yourMap.put("B", 1.5);
            callback.accept(yourMap); //here the consumer gets the map
        }
    }.runTaskAsynchronously(bridge);
}

使用 lambda:

...
referenceToClass.test(map -> { //Lambda
    Object someObject = map.get("A"); 
});

使用正常:

...
referenceToClass.test(new Consumer<Map<String, Object>() {
    @Override
    public void accept(Map<String, Object> map) {
        Object someObject = map.get("A"); 
    }
});

推荐阅读