- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个元胞自动机,我将其作为类的实例运行,并为其提供了特定的线程。对于新功能,即在模拟进行时通过鼠标输入添加活细胞,我必须从主线程访问执行模拟的类实例,以修改我的 Draw 类使用的名为 2D 容器的 ArrayList>“world”作画作为引用。
但是 ArrayList 不是线程安全的,我收到错误。此时我的单元格“世界”只有 50x50,但我想将其大小扩展到 10000^2 甚至更大。 (我会在那个数量级使用四叉树)
所以我的问题是,我应该使用什么样的容器,既是线程安全的,不会占用更高数量级的所有系统资源,又与四叉树概念“兼容”。
我对多线程了解不多,如果打扰这样的重量级线程,我是否应该放弃这个想法,或者我可以在评估用户输入期间暂停线程吗?(实际上我尝试过,我让线程 hibernate 并同时尝试访问实例,但没有成功。)
我检查了一些线程安全容器,它们的性能取决于我是否只是迭代它们或编辑它们的属性等。有太多的事情需要考虑,如果有人能告诉我该选择什么方向,我真的很感激,安德鲁。
最佳答案
您可以使用类似于 double buffering 的概念。因此,有两个不同的平面,我们将它们称为A和B。每个平面代表整个细胞“世界”。 UI线程能够在屏幕上绘制一个平面。
在第一次迭代中,平面 B 通过读取平面 A 进行更新。由于平面A只能读取而不能写入,而平面B只能写入而不能读取,因此可以在没有任何锁的情况下多线程完成此操作。只需将平面分成几个部分并将每个部分分配给不同的线程即可。这可以通过使用fork/join framework动态完成。 .
完成第一次迭代后,将平面 B 移交给 UI 线程。同时,您可以开始下一次迭代,现在从平面 B 读取到平面 A。同样,这可以并行完成。
一般来说,请遵循以下规则:
Java 拥有出色的并发工具,例如 ForkJoinPool
、Exchanger
、CyclicBarrier
等。
只写平面可以维护一个或多个脏区域,这样UI线程就不必一直更新整个UI。但要聪明一点 - 脏区域可能是瓶颈,因为所有线程都必须在其上同步!
关于java - Java 中用于蜂窝自动化的线程安全高性能矩阵式容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307953/
我是一名优秀的程序员,十分优秀!