Spring boot несколько потоков работают неправильно

Я делаю свое первое клиент-серверное приложение. Это имитация лифта. Я сделал сервер с использованием весенней загрузки и клиентской части на 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();
    }

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

Просто мой цент: кажется плохой привычкой не предлагать условие выхода для рекурсивного метода motion. Другое дело треды в треде?

Qingfei Yuan 28.05.2019 22:57

Если ответ, который я дал (или кто-то еще в этом отношении), решил вашу проблему, не забудьте отметить его как таковой.

hfontanez 29.05.2019 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме