проблема многопоточности - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь заставить моего персонажа бегать по двумерной сетке, используя потоки. Я изменяю местоположение (местоположение человека в сетке) на atomicReference и меняю его метод получения и установки на атомарный метод. Однако, когда программа выполняется, мой персонаж движется в неправильных направлениях (продвигаясь вперед на несколько шагов и назад на несколько шагов). Интересно, что пошло не так, предполагая, что поиск пути подходит для использования?

это потому, что метод печати не атомарный? Как мне изменить метод, чтобы он был атомарным? или есть другой способ устранить ошибку состояния гонки?

public abstract class Person {
    Optional<Color> skinColor;
    AtomicReference<Cell> location;
    Move move;


public Person(Cell location, Move move){
    this.location = new AtomicReference<>(location);
    this.skinColor = Optional.empty();
    this.move = move;
}
public void paint(Graphics g){
        Cell temp=location.get();
        if (skinColor.isPresent()) {
            g.setColor(skinColor.get());
            g.fillOval(temp.x + temp.width / 4, temp.y + temp.height / 4, temp.width / 2, temp.height / 2);
            g.drawOval(temp.x + temp.width / 4, temp.y + temp.height / 4, temp.width / 2, temp.height / 2);
            g.setColor(Color.BLACK);
        }
}

public void setLocationOf(Cell loc){
        location.set(loc);
}

public Cell getLocationOf(){
        return location.get();
}

public void setMove(Move move){
    this.move = move;
}

public List<Step> autoMoves() {
    return move.pathPathing(this);

}

}

...