Весенняя загрузка нескольких потоков работает некорректно - PullRequest
1 голос
/ 28 мая 2019

Я делаю свое первое клиент-серверное приложение. Это имитация лифта. Я сделал сервер с использованием весенней загрузки и клиентской части на JavaFX. Мой лифт должен перемещаться между этажами в течение 10 секунд.

Это мой метод POST, куда я отправляю целевой этаж: (Я не знаю почему, но целочисленные значения не приходят)

@PostMapping()
    public String postEndPoint(@RequestBody String floor) {
        return elevatorService.setFloor(Integer.valueOf(floor));
    }

Метод набора:

public String setFloor(Integer floor) {
        if (!isPressed(floor)) { // if button isn't pressed, add to list
            list.add(floor);
        }
        targetFloor = list.get(list.size() - 1);
        motion();
        if (list.get(list.size() - 1) == currentFloor) { // when we arrive, delete pressed button
            list.remove(list.size() - 1);
        }
        return String.valueOf(floor);
    }

 private boolean isPressed(Integer floor) {
        return list.contains(floor);
    }

и логика движения:

private void motion() {
        new Thread(() -> {
            try {
                    Thread.sleep(10000);
                    if (currentFloor < targetFloor) {
                        currentFloor++;
                    } else {
                        currentFloor--;
                    }
                    if (currentFloor != targetFloor) {
                        motion();
                }
            } catch (InterruptedException ignored) { }
        }).start();
    }

Это хорошо работает, если я нажимаю на нужном этаже и жду, когда лифт прибудет, но если я вызываю лифт на нескольких этажах одновременно, это работает неправильно. Может ли кто-нибудь помочь мне решить эту проблему? Спасибо.

1 Ответ

1 голос
/ 29 мая 2019

Я уверен, что ваша проблема в том, что вы не используете атомарные значения.Измените ваши примитивные целые числа для объекта Atomic Integer .

Я предлагаю вам прочитать это, чтобы узнать больше о том, почему и как использовать атомарные значения: https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...