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

标签 java multithreading swing user-interface eventqueue

我正在编写一个附带 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/

相关文章:

数组列表中的Java分组值

java - 让线程等待与停止和启动

c++ - 指定给 RtlValidateHeap DLL 的地址无效

java - jTextField 从数据库自动完成

java - 使用 Jframe 将英寸转换为厘米

java - 如何更改 Spring 5 webflux websocket 客户端上的帧/缓冲区大小

java - 使用泛型在 Java 中实现工厂模式

java - 为什么将响应 header 设置为调度程序不起作用

c# - “使用”语句与 'try finally'

java - Install4J 注册自定义 URI Mac