Я изучаю потоки в Java и пытаюсь сделать что-то вроде этого:
У меня есть матрица со значениями, и для каждой ячейки в матрице есть назначенный ей поток, который обновляетзначения (в соответствии с игрой жизни Конвея ).Все потоки должны обновлять значения матрицы один раз, а затем, когда все они будут завершены, основной поток отобразит обновленную матрицу, а затем спросит пользователя, должен ли он также рассчитать следующий шаг, что означает повторение тех же самых вычислений заново.,
Теперь я написал почти весь базовый код, включая потоки и то, как они обновляют ячейку, за которую они отвечают, но я не могу найти способ, чтобы основной поток уведомил все остальные потоки о пробуждениивстать, сделать свою работу, а затем вернуться в сон и получить от них уведомление после того, как все они закончили свою работу на данный момент.Я пытался использовать методы wait () и notify () / notifyAll (), но они предназначены только для синхронизированных методов, которые мне не нужно реализовывать в коде (поскольку я использую две матрицы, чтобы убедиться,что сначала все потоки обновляют свою соответствующую ячейку, и только тогда текущая матрица станет матрицей следующего поколения).
Вот метод run () для потоков:
public void run(boolean[][] currentGenMatrix) {
updateLifeMatrix(currentGenMatrix);
while(true) {
try {
wait(); // Wait for the next step before starting
} catch (InterruptedException e) {
e.printStackTrace();
}
updateLifeMatrix(m_nextGenMatrix); // Update the current matrix to be the "next generation matrix" from the previous generation
int neighbours = checkNeighbours(currentGenMatrix);
m_nextGenMatrix[this.m_heightIndex][this.m_widthIndex] = setNewLifeOrDeath(neighbours, getCurrentLifeOrDeath(currentGenMatrix)); // Update the "next generation matrix" cell assigned to this thread
}
}
Во время инициализации матрицы я запускаю все потоки после их создания, а затем они сначала ждутуведомление, прежде чем сделать первый шаг.Я также читал о мониторах, чтобы понять, нужно ли мне это, но примеры, которые я видел в Интернете, не вписываются в мой код.