gpt4 book ai didi

java - Java 中用于蜂窝自动化的线程安全高性能矩阵式容器?

转载 作者:行者123 更新时间:2023-12-01 12:38:55 25 4
gpt4 key购买 nike

我正在做一个元胞自动机,我将其作为类的实例运行,并为其提供了特定的线程。对于新功能,即在模拟进行时通过鼠标输入添加活细胞,我必须从主线程访问执行模拟的类实例,以修改我的 Draw 类使用的名为 2D 容器的 ArrayList>“world”作画作为引用。

但是 ArrayList 不是线程安全的,我收到错误。此时我的单元格“世界”只有 50x50,但我想将其大小扩展到 10000^2 甚至更大。 (我会在那个数量级使用四叉树)

所以我的问题是,我应该使用什么样的容器,既是线程安全的,不会占用更高数量级的所有系统资源,又与四叉树概念“兼容”。

我对多线程了解不多,如果打扰这样的重量级线程,我是否应该放弃这个想法,或者我可以在评估用户输入期间暂停线程吗?(实际上我尝试过,我让线程 hibernate 并同时尝试访问实例,但没有成功。)

我检查了一些线程安全容器,它们的性能取决于我是否只是迭代它们或编辑它们的属性等。有太多的事情需要考虑,如果有人能告诉我该选择什么方向,我真的很感激,安德鲁。

最佳答案

您可以使用类似于 double buffering 的概念。因此,有两个不同的平面,我们将它们称为AB。每个平面代表整个细胞“世界”。 UI线程能够在屏幕上绘制一个平面。

在第一次迭代中,平面 B 通过读取平面 A 进行更新。由于平面A只能读取而不能写入,而平面B只能写入而不能读取,因此可以在没有任何锁的情况下多线程完成此操作。只需将平面分成几个部分并将每个部分分配给不同的线程即可。这可以通过使用fork/join framework动态完成。 .

完成第一次迭代后,将平面 B 移交给 UI 线程。同时,您可以开始下一次迭代,现在从平面 B 读取到平面 A。同样,这可以并行完成。

一般来说,请遵循以下规则:

  • 在每次迭代中,一个平面是只读的,另一个平面是只写的
  • UI线程始终引用只读平面进行重绘。
  • 单元格更新线程具有单独的、不重叠的读取和写入部分。
  • 唯一的同步是在每次迭代结束时切换平面时。

Java 拥有出色的并发工具,例如 ForkJoinPoolExchangerCyclicBarrier 等。

只写平面可以维护一个或多个脏区域,这样UI线程就不必一直更新整个UI。但要聪明一点 - 脏区域可能是瓶颈,因为所有线程都必须在其上同步!

关于java - Java 中用于蜂窝自动化的线程安全高性能矩阵式容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com