Return 来自 BukkitRunnable 的值
Return value from BukkitRunnable
我使用 BukkitRunnable 向地图异步添加值,然后我想 return 地图。
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;
}
如果我想使用这张地图,它将永远是空的。它是 return 在将值添加到地图之前编辑的,因为我将它们添加到另一个线程中。
我真的很想使用 BukkitRunnable 而不是 Future。我怎样才能做到这一点?我需要延迟 return 地图,或者更好的是 return 地图,不知何故,来自 BukkitRunnable。
问题是 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");
}
});
我使用 BukkitRunnable 向地图异步添加值,然后我想 return 地图。
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;
}
如果我想使用这张地图,它将永远是空的。它是 return 在将值添加到地图之前编辑的,因为我将它们添加到另一个线程中。
我真的很想使用 BukkitRunnable 而不是 Future。我怎样才能做到这一点?我需要延迟 return 地图,或者更好的是 return 地图,不知何故,来自 BukkitRunnable。
问题是 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");
}
});