Swing - 在上一个方法完成之前停止执行一个方法

Swing - Stopping a method from executing until previous method is complete

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

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;
}
如果使用 'delayed message type',

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

有什么方法可以让 getCommand 的执行保持到 addMessageToLog 完成?

我遇到了 synchronized 选项,但我不是很了解它,不确定它是否可以在这种情况下使用。

有一种方法叫忙等。 Busy Waiting on Wikipedia

这样实现:

  1. 创建一个字段,确保已执行 addMessageToLog。

    private static boolean ready = false;

  2. 如果 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-Method 中调用 getCommand。