gpt4 book ai didi

java - Swing - 停止方法执行,直到前一个方法完成

转载 作者:行者123 更新时间:2023-11-30 07:33:18 26 4
gpt4 key购买 nike

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

像这样实现:

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

    私有(private)静态 boolean 就绪= 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方法中调用getCommand。

关于java - Swing - 停止方法执行,直到前一个方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com