public void nextStep() { synchronized (this) { if (needRecalc) { recalcImpact(); needRecalc = false; } for (iter.x = 0; iter.x < mSize; ++iter.x) { for (iter.y = 0; iter.y < nSize; ++iter.y) { final double imp = impMat[iter.x][iter.y]; if (rules.dieCond(imp)) { fldNew[iter.x][iter.y] = DEAD; } else if (rules.birthCond(imp)) { fldNew[iter.x][iter.y] = ALIVE; } } } swap(); needRecalc = true; recalcImpact(); } setChanged(); notifyObservers(new FieldUpdate(this)); }