从BukkitRunnable返回值

时间:2019-05-16 15:50:11

标签: java minecraft bukkit

我使用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返回地图。

1 个答案:

答案 0 :(得分:2)

问题是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"); 
    }
});