我正在用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
选项,但我并不理解它,并且不确定它是否可以在此实例中使用。
答案 0 :(得分:1)
有一种叫繁忙等待的方式。 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。