Я делаю свое первое клиент-серверное приложение. Это имитация лифта. Я сделал сервер с использованием весенней загрузки и клиентской части на 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();
}
Это работает хорошо, если я нажимаю на нужный этаж и жду, когда приедет лифт, но если я вызываю лифт на несколько этажей одновременно, он работает неправильно. Может ли кто-нибудь помочь мне решить эту проблему? Спасибо.
Если ответ, который я дал (или кто-то еще в этом отношении), решил вашу проблему, не забудьте отметить его как таковой.
Я уверен, что ваша проблема в том, что вы не используете атомарные значения. Измените свои примитивные целые числа для объекта Атомарное целое число.
Я предлагаю вам прочитать это, чтобы узнать больше о том, почему и как использовать атомарные значения: https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html
Просто мой цент: кажется плохой привычкой не предлагать условие выхода для рекурсивного метода
motion
. Другое дело треды в треде?