Возвращаемое значение из BukkitRunnable - PullRequest
0 голосов
/ 16 мая 2019

Я добавляю значения в асинхронную карту, используя 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 Ответ

2 голосов
/ 17 мая 2019

Проблема в том, что 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);
}

Использование лямбда:

...
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"); 
    }
});
...