我正在编写一个带有 GUI (Swing) 的客户端应用程序。我的两个类 ClientClass 和 MainFrame 正在运行不同的线程,但需要相互调用方法。ClientClass 在应用程序生命周期的某个时间点在 EventQueue 线程 (displayGUI()) 上实例化 GUI (MainFrame)。ClientClass 包含许多方法,例如从客户端类线程调用的 recv(),用于更新 MainFrame。反过来,MainFrame 具有由事件触发的方法,例如按下按钮调用 ClientClass 中的方法。我假设 EventQueue 线程正在调用示例中处理按钮按下的烦人方法?
我很确定这种应用程序非常普遍,我很喜欢其他人的见解。我有一种感觉,我正在做的事情不是线程安全的,那么我该如何修复/改进这个应用程序的当前模型?
示例代码:
MainFrame.java:
public MainFrame(ClientClass c) {
client = c;
// <Misc init code here>
btnSend = new JButton("Send");
btnSend.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
client.send("Hello!");
}
});
btnSend.setBounds(171, 120, 89, 23);
contentPane.add(btnSend);
}
public void updateElement() {
// Update of some element here, called from ClientClass
}
客户端类.java:
private MainFrame mainFrame;
public ClientClass() {
}
public void displayGUI() {
final ClientClass c = this;
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
mainFrame = new MainFrame(c);
mainFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void send(String msg) {
// Socket send operations here
// Currently called by the GUI's EventQueue thread?
}
public void recv() {
// Socket recv operations here
mainFrame.updateElement();
}