Java Swing—在前一个方法完成之前停止方法的执行

Java Swing—在前一个方法完成之前停止方法的执行,java,swing,timer,synchronized,thread-sleep,Java,Swing,Timer,Synchronized,Thread Sleep,我正在用Swing编写GUI程序,在一个类中有以下两种方法: private void addMessageToLog(MessageType type, String message) { if ((type.equals(MessageType.DELAYED_ERROR)) || (type.equals(MessageType.DELAYED_INFO)) || (type.equals(MessageType.DELAYED_SUCCESS))) { Timer

我正在用Swing编写GUI程序,在一个类中有以下两种方法:

private void addMessageToLog(MessageType type, String message) {
    if ((type.equals(MessageType.DELAYED_ERROR)) || (type.equals(MessageType.DELAYED_INFO)) || (type.equals(MessageType.DELAYED_SUCCESS))) {
        Timer timer = new Timer(500, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                getModelObserver().createMessage(type, message);
            }
        });
        timer.setRepeats(false);
        timer.start();
    }
    else {
        getModelObserver().createMessage(type, message);
    }
}

private String getCommand(String instruction, String error) {
    String command = "";
    while (!isValid(command)) {
        addMessageToLog(MessageType.INFO, instruction);
        command = getModelObserver().getCommand();
        checkCommand(command, error);
    }
    return command;
}
addMessageToLog
如果使用“延迟消息类型”,则可以添加延迟。这很好,但是如果在
addMessageToLog
调用之后立即调用
getCommand
,那么
getCommand
内部的非延迟
addMessageToLog
将在先前调用的延迟之前执行

例如:

addMessageToLog(MessageType.DELAYED_INFO, "Delayed message")
getCommand("Not delayed", "Error")
输出:

Not delayed
Delayed message
鉴于我想要:

*0.5 second pause*
Delayed message
Not delayed
有没有办法在
addMessageToLog
完成之前保持执行
getCommand


我遇到了
synchronized
选项,但我不太了解它,也不确定它是否可以用于此实例。

有一种方法称为忙等待

这样实施:

  • 创建一个字段,确保已执行addMessageToLog

    private静态布尔就绪=false

  • 如果addMessageToLog成功结束,请将此字段设置为true

    private String getCommand(String instruction, String error) {
    [...]
    ready = true;
    return command;
    
  • 现在,您可以使用以下方法:

    private String getCommand(String instruction, String error){
        while(!ready){sleep(1);} //Busy waiting
        [...]
    

    另一种方法是在addMessageToLog方法中调用getCommand。

    注意Swing是单线程的,并且不是线程安全的,这意味着您不应该出于任何原因(比如调用
    thread.sleep
    )或从EDT上下文之外更新UI。请查看以了解更多详细信息