gpt4 book ai didi

java - 如何在 GUI 线程之间共享信息?

转载 作者:行者123 更新时间:2023-11-29 08:06:29 27 4
gpt4 key购买 nike

我正在编写一个附带 GUI (Swing) 的客户端应用程序。我的两个类,ClientClass 和 MainFrame,正在运行不同的线程,但需要在彼此中调用方法。 ClientClass 在 EventQueue 线程 (displayGUI()) 上的应用程序生命周期的某个时刻实例化 GUI (MainFrame)。 ClientClass 包含许多方法,如 recv(),从客户端类线程调用,更新 MainFrame。反过来,MainFrame 具有由事件触发的方法,例如按下按钮调用 ClientClass 中的方法。我假设 EventQueue 线程正在调用示例中处理按钮按下的烦人方法?

我很确定这种应用程序很常见,我很想听听其他人的见解。我感觉我正在做的事情不是线程安全的,那么我该如何修复/改进此应用程序的当前模型?

示例代码:

主框架.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();
}

最佳答案

在这种特殊情况下,Xeon 的回答可能对您更直接有用,但作为一般原则,您可能需要阅读 Singletons .

通过创建单个单例(在您描述的情况下通常称为管理器或类似名称),您可以拥有一个执行与您的应用程序关联的“工作”的类,并拥有 GUI 线程( s) 向那个单例发送任务。

关于java - 如何在 GUI 线程之间共享信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922707/

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