Я создаю (параллельный) симулятор для набора из N частиц, движущихся в пространстве согласно законам Ньютона. Моя идея - это модель каждой частицы как задача, которая взаимодействует с другими частицами (задачами), чтобы получить свои позиции и массы, чтобы вычислить силу, на которую она подвержена. Каждая задача частицы - это что-то вроде
while(true){
force = thisParticle.calculateNetForce(allTheParticles);
thisParticle.waitForAllTheParticlesToCalculateNetForce(); // synchronization
thisParticle.updatePosition(force);
thisParticle.waitForAllTheParticlesToUpdateTheirState(); // synchronization
}
У меня может быть много частиц (100 или более), поэтому я не могу создать такое количество потоков Java (которые отображаются на физические потоки).
Моя идея - использовать потоки Runtime.getRuntime().availableProcessors()+1
, на которые могут выполняться многие задачи.
Однако я не могу использовать FixedThreadExecutor, потому что задачи-частицы не заканчиваются. Я хотел бы использовать FixedThreadExecutor, который также может выполнять своеобразное планирование внутри. Знаете ли вы что-то для этой цели?
Или вы могли бы предложить мне более подходящие подходы для моделирования такой системы с точки зрения concurrency (например, разной декомпозиции задачи)?
P.s.: Я ограничен "классическими" concurrency механизмами, не считая актеров или аналогичных архитектур.