gpt4 book ai didi

Java 并发数 : executing many "infinite" tasks with few threads

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:58 25 4
gpt4 key购买 nike

我正在为一组根据牛顿定律在空间中移动的 N 个粒子构建一个(并发)模拟器。我的想法是将每个粒子建模为一个任务,它与其他粒子(任务)相互作用以获得它们的位置和质量,从而计算它所受到的合力。每个粒子任务都是

while(true){
force = thisParticle.calculateNetForce(allTheParticles);
thisParticle.waitForAllTheParticlesToCalculateNetForce(); // synchronization
thisParticle.updatePosition(force);
thisParticle.waitForAllTheParticlesToUpdateTheirState(); // synchronization
}

我可以有很多粒子(100 个或更多),所以我无法创建如此多的 Java 线程(映射到物理线程)。我的想法是使用可以执行许多任务的 Runtime.getRuntime().availableProcessors()+1 线程。

但是,我不能使用 FixedThreadExecutor,因为粒子任务不会结束。我想使用 FixedThreadExecutor,它还必须能够在内部执行某种调度。你知道这方面的知识吗?

或者,您能否建议我从并发的角度(例如,不同的任务分解)为此类系统建模的更好方法?

P.s.:我仅限于“经典”并发机制,不包括 actor 或类似架构。

最佳答案

性能的最大 killer 可能是您执行的线程安全检查,以确保所有粒子都以线程安全的方式进行交互。我建议您每个核心使用一个线程,并尽量减少线程之间的交互。这可以通过将您的空间划分为线程来完成,例如一半 X,一半 Y,一半 Z 将空间分成 8 份。您可以同时独立地查看每个空间中的所有交互,您只需要担心粒子从一个空间/线程传递到另一个空间/线程。

关于Java 并发数 : executing many "infinite" tasks with few threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18059123/

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