我正在用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可能会增加延迟。这可以正常工作,但是如果我在getCommand调用后立即调用addMessageToLog,则addMessageToLog内部的非延迟getCommand将在之前调用的延迟延迟之前执行。

例:

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

像这样实现它:


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

private static boolean ready = 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-Method中调用getCommand。

09-26 15:19