我正在用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。