Java 圆滑; 运行 延迟后没有循环的命令;

Java slick; run command after delay without looping;

我正在 Java slick 中编写游戏,我想添加消息管理。应该有一个包含所有尚未发送的消息的 ArrayList。每 2 秒应显示列表中的下一项。

我的逻辑:

在更新方法中,应该显示第一条消息。 2 秒后该项目被删除。

我的问题是只显示第一个,其他的不显示。当我调试时,我注意到在这 2 秒之后计时器继续删除第一个项目而没有 2 秒的中断。

请你帮我找到问题或更好的逻辑。

这是我的一些编码。

将消息放入队列的方法

public static void showMessage(String message){
    msgHandler.addMessage(message);
}

渲染方法

public void render(GameContainer gameContainer, Graphics g) throws SlickException {
    msgHandler.getCurrentMessage().displayMessage(g);
    if(msgHandler.isTimerCompleted()){
        msgHandler.next();
    }
}

消息管理器class

public class MessageHandler {
    private ArrayList<Message> messages;
    private int duration = 2000;
    private Timer timer = new Timer();
    private boolean isTimerCompleted = true;

    public MessageHandler() {
        messages = new ArrayList<>();
    }

    public void next() {

        isTimerCompleted = false;
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (messages.size() > 0) {
                    messages.remove(0);
                }
                System.out.println("test");
            }
        }, duration);
        isTimerCompleted = true;
    }

    public Message getCurrentMessage() {
        if (messages.size() > 0)
            return messages.get(0);
        return new Message("");
    }

    public void addMessage(String message, int x, int y) {
        messages.add(new Message(message, x, y));
    }

    public void addMessage(String message) {
        messages.add(new Message(message));
    }
}

您似乎想使用如下例所示的循环计时器。 此外,timer.schedule 在计时器结束之前不会暂停执行,而是在时间限制结束时执行计时器的 运行() 部分。当前,isTimerCompleted = true;将在您创建计时器后立即执行。

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000, 2*60*1000);

这里有一个很好的概述:

编辑:

更清楚地说,"isTimerCompleted = true" 会在您的计时器任务创建后立即执行,因此您实际上是在不断地创建新的 TimerTask。尝试将 "isTimerCompleted = true;" 移动到 "public void run() { .. }" 代码块的内部。

要了解正在发生的事情的示例,请尝试 运行 运行这段简单的代码以查看您的语句的执行顺序:

import java.util.TimerTask;
import java.util.Timer;

public class TimerSchedule {

    public Timer timer = new Timer();

    public void TestTimerSchedule() {
        System.out.println("Before timer.schedule");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("TimerTask");
            }
        }, 2000);

        System.out.println("After timer.schedule");
    }

}

输出:

Before timer.schedule
After timer.schedule
TimerTask