最近写SEE2014的代码,碰到了多线程访问共享变量的问题。
1. 单击发送button,监听器置sendFlag为true.
2. 另一个线程循环等待sendFlag置true,并发送消息。
代码如下,这是GUI中button响应函数的方法:
public synchronized void sendButtonActionActionPerformed(ActionEvent event) {
sendFlag = true;
synchronized (sendFlagObject) {
sendFlagObject.notify();
}
}
public boolean getSendFlag() {
return sendFlag;
}
public void setSendFlag() {
sendFlag = false;
}
其中public Object sendFlagObject = new Object(); 其为两个线程共享的对象
1 初始状态sendFlag为False,当单击事件发生,sendFlag置True,并Notify wait在sendFlagObject的线程。
2 sendMessage一开始wait(),当事件notify,唤醒,跳出第一个循环,执行sendInteraction.
3 循环结束,sendFlag置为false,进入下个循环,直至输入“.”,结束
这是另一个线程等待flag变化,发送消息的方法
private synchronized void sendMessage() throws IOException,
FederateNotExecutionMember, NotConnected,
InteractionClassNotPublished, InteractionParameterNotDefined,
InteractionClassNotDefined, SaveInProgress, RestoreInProgress,
RTIinternalError {
while (supplydepotUI.getSendMessage().compareTo(".") != 0) {
String sourceName = _me;
while (!supplydepotUI.getSendFlag()) {
try {
System.out.println("Still waiting");
synchronized (supplydepotUI.sendFlagObject) {
supplydepotUI.sendFlagObject.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(supplydepotUI.getSendDestination()
+ supplydepotUI.getSendMessage());
sendInteractions(sourceName, supplydepotUI.getSendDestination(),
false, supplydepotUI.getSendMessage());
supplydepotUI.setSendFlag();
}
}