我正在构建一个(并发)模拟器,用于一组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.:我受限于“经典”的并发机制,不包括演员或类似的体系结构。
thisParticle.waitForAllTheParticlesToCalculateNetForce()
有效地等待某些事情(通过实际等待或CountdownLatch/CyclicBarrier/Phaser等),则运行该方法的线程将返回到池中并可用于其他任务。不确定为什么您的FixedThreadPool方法不起作用。 - assyliasawait
是一个非阻塞调用:线程会变为空闲状态,直到所有参与方都调用了await()
。因此,除非在调用 await 时持有锁定,否则其他任务应该能够使用该空闲线程。也许值得发布一些你的代码。 - assyliasawait
将等待/阻塞,直到所有参与方都在等待。在你的情况下,只有两个线程会触发屏障并无限期地等待。一旦所有10个线程调用了await
,那么方法的其余部分就会继续执行。 - John Vint