首页 > 解决方案 > 是什么决定了哪个事件将首先运行?

问题描述

我创建了一个测试插件作为一个科学项目来尝试确定是否同时调用 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 首先被触发?

标签: eventsminecraftbukkit

解决方案


这很难确定。由于registerEvents引出了createRegisteredListenershttps://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java的功能

在那里,他们使用 aHashSet来存储 Listener 类的方法。因此,正是他们为每种方法提供的伪随机散列来确定首先注册哪个事件。

我不确定,但我猜每次您注册事件时,它都是先注册的随机事件。这就是为什么您应该使用 differenteventPriorities来确定首先调用哪个。

如果你真的想更深入,你必须拆开createRegisteredListeners我之前在这个回复中发布的 github-link 的功能。但我想它永远不会完全确定,因为HashSet使用了以下235内容JavaPluginLoader.java

methods = new HashSet<Method>(publicMethods.length, Float.MAX_VALUE);

随着方法被添加到集合中,它永远无法确定它们最终在 RAM 中的哪个位置。

我希望我能在这篇文章中帮助你,即使它并没有真正回答你原来的问题。


推荐阅读