是什么决定哪个事件将首先运行?

时间:2019-05-07 21:06:31

标签: events minecraft bukkit

我已经创建了一个测试插件作为科学项目,以尝试确定是否同时调用了同一事件中的2个,该事件将首先执行。

public class TestPlugin extends JavaPlugin implements Listener {
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }
    @EventHandler(priority = EventPriority.HIGHEST)
    public void event1(PlayerInteractEvent e) {
        System.out.println("event 1");
    }
    @EventHandler(priority = EventPriority.HIGHEST)
    public void event2(PlayerInteractEvent e) {
        System.out.println("event 2");
    }
}

插件产生的输出是

[17:01:51 INFO]: event 2
[17:01:51 INFO]: event 1

如果在类文件中首先列出了event1,为什么会首先触发event2?

1 个答案:

答案 0 :(得分:2)

这很难确定。由于registerEvents指向https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java的功能createRegisteredListeners

他们在其中使用HashSet来存储您的侦听器类的方法。因此,伪随机哈希提供了每种方法来存储它,从而确定哪个事件首先被注册。

我不确定,但是我想每次您注册事件时,都是先注册的随机事件。这就是为什么您应该使用不同的eventPriorities以确定首先调用哪个的原因。

如果您真的想更深入,则必须拆开我在此答复中较早发布的github链接的功能createRegisteredListeners。但是我想它永远不会完全确定,因为HashSet的{​​{1}}行中使用了235

JavaPluginLoader.java

由于将方法添加到集合中,因此无法确定它们最终在RAM中的哪个位置。

即使这篇文章并没有真正回答您的原始问题,我希望我能为您提供帮助。