我使用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返回地图。
答案 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");
}
});