У меня есть Java-программа, которая запускает множество небольших симуляций. Он запускает генетический алгоритм, где каждая фитнес-функция представляет собой симуляцию с использованием параметров каждой хромосомы. Каждый из них занимает около 10 секунд, если запускается сам по себе, и я хочу запустить довольно большую популяцию (скажем, 100?). Я не могу начать следующий раунд симуляций, пока не закончился предыдущий. У меня есть доступ к машине с множеством процессоров, и мне интересно, нужно ли мне что-то делать, чтобы симуляции работали параллельно. Я никогда не писал ничего явно для многоядерных процессоров, и я понимаю, что это сложная задача.
Итак, вот что я хотел бы знать: в какой степени и насколько хорошо JVM работает параллельно? Я читал, что он создает темы низкого уровня, но насколько он умен? Насколько это эффективно? Будет ли моя программа работать быстрее, если я сделаю каждую симуляцию потоком? Я знаю, что это огромная тема, но не могли бы вы указать мне некоторую вводную литературу, касающуюся параллельной обработки и Java?
Большое спасибо!
Обновление:
Хорошо, я реализовал ExecutorService и заставил мои небольшие симуляции реализовать Runnable и методы run (). Вместо того чтобы писать это:
Simulator sim = new Simulator(args);
sim.play();
return sim.getResults();
Я пишу это в своем конструкторе:
ExecutorService executor = Executors.newFixedThreadPool(32);
И затем каждый раз, когда я хочу добавить новую симуляцию в пул, я запускаю это:
RunnableSimulator rsim = new RunnableSimulator(args);
exectuor.exectue(rsim);
return rsim.getResults();
Метод RunnableSimulator::run()
вызывает метод Simulator::play()
, ни один из них не имеет аргументов.
Я думаю, что получаю помехи от потоков, потому что теперь ошибка симуляции. Под ошибкой я подразумеваю, что переменные содержат значения, которые они на самом деле не должны. Никакой код в симуляции не был изменен, и перед симуляцией было много разных аргументов. Сим работает следующим образом: каждый ход дается часть игры и проходит по всей локации на игровом поле. Он проверяет, является ли данное местоположение действительным, и если да, фиксирует фигуру и измеряет доброту этой доски. Теперь очевидно, что недопустимые местоположения передаются методу фиксации, что приводит к ошибкам индекса за пределами границ.
Каждое моделирование - это собственный объект, верно? На основании приведенного выше кода? Я могу передать точно такой же набор аргументов классам RunnableSimulator
и Simulator
, и работоспособная версия будет выдавать исключения. Как вы думаете, что может вызвать это и что я могу сделать, чтобы предотвратить это? Могу ли я предоставить несколько примеров кода в новом вопросе, чтобы помочь?