Java 如何有效地一次更新一个类的数千个实例?

Java 如何有效地一次更新一个类的数千个实例?,java,class,arraylist,Java,Class,Arraylist,我正在为Minecraft服务器开发一个插件,在那里你可以将redstone连接到互联网。该插件通过使用内置在游戏中的讲台来发送/接收任意红石信号。它使用MQTT协议与internet通信 目前,我有一个名为LecternHandler的讲台加载程序,它为创建的每个讲台加载一个LecternHandler的新实例。LetterHandler的所有实例都存储在一个数组列表中,该数组列表的格式为的键/值,位置是讲台的位置(该位置存储世界和坐标,是Bukkit api的内置功能) 至于数据存储,我使用

我正在为Minecraft服务器开发一个插件,在那里你可以将redstone连接到互联网。该插件通过使用内置在游戏中的讲台来发送/接收任意红石信号。它使用MQTT协议与internet通信

目前,我有一个名为
LecternHandler
的讲台加载程序,它为创建的每个讲台加载一个
LecternHandler
的新实例。
LetterHandler
的所有实例都存储在一个数组列表中,该数组列表的格式为
的键/值,位置是讲台的位置(该位置存储世界和坐标,是Bukkit api的内置功能)

至于数据存储,我使用MySQL将选择器和播放器设置保存在两个不同的表中。读经台表存储读经台的位置及其id等信息。播放器表存储连接到的MQTT代理、是否使用tls、身份验证详细信息等信息

我想做的是能够更新播放器的设置和卸载和重新加载的飞行中的讲台。目前,我必须遍历每个
选择器处理程序
,检查它是否属于播放器,然后卸载并重新加载。然后,
LecternHandler
将从MySQL检索新设置

我相信如果我一次循环数千个(如果不是上万个)讲台,这可能会导致性能问题,特别是如果玩家自己有数千个讲台

如何解决潜在的性能问题

对于那些感兴趣的人,如果你想看到代码本身,请在GPL-3下


我的目标是使这个插件在处理大量的讲台时非常有效,这样人们就不会因为他们想要的一个整洁的功能而让他们的服务器速度变慢。

我花了一些时间讨论如何有效地迭代和更新一个类的数千个实例

首先,我需要异步处理这些类,这样当我对大量数据执行大量操作时,它就不会滞后于主线程。提醒我可以使用多线程代码

然后,我需要创建另一个arraylist来处理对特定玩家拥有的讲台的引用。arraylist看起来像
,它有一个我可以循环使用的
LetterHandler
实例的arraylist。这将有助于我只让我循环通过
LecternHandler
的一部分实例,而不是完整列表。这一点很重要,因为每个LetterHandler都有它自己处理的MQTT客户机(它自己异步运行,但我需要它做得更好)

我可以了解如何创建一个播放器设置数据类,然后由属于该播放器的每个LetterHandler引用。
LecternHandler
的所有实例都将包含对播放器设置的引用,当重新加载时,它将从中读取这些设置。我可能会推迟,因为我不知道如何使这个线程安全,如果它还不安全

异步更新
LetterHandler
本身应该可以,因为它不依赖Bukkit api,除非从MQTT接收数据以更新讲台所在的当前页面(当前页面在1-15范围内更改redstone输出,对于不知道的人,redstone是Minecraft版本的电力)

我在这个设置中看到的唯一潜在问题(在我当前的设置中已经存在)是由于加载数千个(如果不是上万个)类实例而导致的潜在ram使用,但是,这超出了这个问题的范围


这将允许批量或分块更新
LecternHandler
的实例,当前jvm可以处理这些实例,以防止延迟或冻结问题,因为这不会浪费主线程的cpu周期。

您熟悉元编程吗?我将重新措辞。你知道橡皮鸭吗。不,我不熟悉元编程。虽然我知道橡皮鸭是什么,但我也不确定它们与编程有什么关系,尽管如果我熟悉元编程可能会有意义。你尝试过多线程还是想要优化?@user我目前使用回调将函数传递到我用于MQTT的HiveMQ库。除了回调之外,我的代码中没有任何支持异步的函数。至于从回调更新讲台,我必须使用Bukkit的调度程序将用于更新讲台的代码放在主线程上,因为由于Minecraft目前处理块操作的方式,世界上不允许操作块。我想说的是,我在寻找一个指针,指示如何有效地操作大量数据的一部分。当我说不允许操作块时,我的意思是不允许异步操作块。我将了解如何使Lettern处理程序加载和操作本身异步,因为除了现有回调之外,它不涉及bukkit api。如果有人对此有更好的解决方案,请给出答案,我希望了解如何更好地编写性能和内存消耗方面的代码。谢谢