Я создаю (параллельный) симулятор для набора 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 не сработает. - person assylias   schedule 05.08.2013PROCESSORS+1
задачи. - person metaphori   schedule 05.08.2013await
- это неблокирующий вызов: поток становится бездействующим до тех пор, пока все стороны не вызовутawait()
. Поэтому, если вы не удерживаете блокировку при вызове await, другие задачи должны иметь возможность использовать этот незанятый поток. Возможно, стоит опубликовать часть вашего кода. - person assylias   schedule 05.08.2013await
будет ждать/блокировать, пока все стороны не будут ждать. В вашем случае только два потока преодолеют барьер и будут ждать бесконечно. Как только все десять потоков вызовут await, остальная часть метода будет продолжена. - person John Vint   schedule 05.08.2013