2016-03-02 60 views
1

我写与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,那么getCommand内部的非延迟addMessageToLog将在先前称为延迟之前执行。

例子:

addMessageToLog(MessageType.DELAYED_INFO, "Delayed message") 
getCommand("Not delayed", "Error") 

输出:

Not delayed 
Delayed message 

而我想:

*0.5 second pause* 
Delayed message 
Not delayed 

有没有办法举行的getCommand直到addMessageToLog执行完成?

我遇到了​​选项,但我不太了解它,并且不确定它是否可以在此实例中使用。

+0

请注意,Swing是单线程的,而不是线程安全的,这意味着您不应该因为任何原因(比如调用Thread.sleep)或者在EDT上下文之外更新UI来阻止UI。查看[并发中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)以获取更多详细信息 – MadProgrammer

回答

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; 
    

现在你可以使用这个方法是这样的:

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

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

相关问题