Swing - 停止执行方法直到上一个方法完成

时间:2016-03-02 21:21:41

标签: 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 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选项,但我并不理解它,并且不确定它是否可以在此实例中使用。

1 个答案:

答案 0 :(得分:1)

有一种叫繁忙等待的方式。 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;
    
  3. 现在您可以像这样使用此方法:

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

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