Я думаю, что может быть лучше вручную сообщить потоку, что он должен завершить свою работу, если он содержит некоторый флаг, на который он ссылается, чтобы знать, когда выходить из цикла.Например:
class Impurity(var currentCell: Int) {
...
private var _continue = true
fun startMoving() {
thread = Thread {
while (_continue) {
}
}
...
fun stopMoving() {
_continue = false
}
}
Кроме того, вы можете также подождать, пока сам поток не умрет, как часть вызова на stopMoving
.Это гарантирует, что все потоки определенно получили сигнал и выйдут из своих циклов, прежде чем вы вызовете Cells.printCells
.Например, вы можете добавить этот метод в класс Impurity
:
fun waitForEnded() = thread.join()
И вы можете обновить stopMoving
в основном классе, чтобы вызывать этот метод после подачи сигнала каждому потоку об остановке:
private fun stopMoving(impurities: ArrayList<Impurity>) {
for (impurity in impurities)
impurity.stopMoving()
impurities.forEach(Impurity::waitForEnded)
}