Spring Boot几个线程工作不正常

时间:2019-05-28 20:42:25

标签: java multithreading spring-boot

我正在制作我的第一个客户端服务器应用程序。这是电梯的模仿。我已经在JavaFX上使用spring boot和client part完成了服务器。我的电梯必须在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 个答案:

答案 0 :(得分:1)

我确定您的问题是您没有使用原子值。更改Atomic Integer对象的原始整数。

我建议您阅读以下内容,以了解有关为什么以及如何使用原子值的更多信息:https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html