java - Swing 线程: Event dispatch Thread

标签 java multithreading swing event-dispatch-thread

目前我在使用 swing 的线程模型时遇到了一些重大问题。 AFAIK Swing 定义了 3 个不同的线程:

  • 初始线程:程序在这里启动,也称为主方法,其中 GUI 将通过一些 init() 方法启动
  • 事件调度线程:GUI 的主线程。 GUI 初始化、更新 GUI 等的每一点都属于这个单一线程
  • 工作线程:用于一些重量级任务的背景内容

示例:

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // init gui here
    }
});
}

这是一个简单的示例,其中 main 方法是初始线程,程序在其中启动,我们调用一个新线程(事件调度线程),我们的 GUI 将在其中启动。

这是正确的吗?

现在我的问题:

我正在编写一个 Swing 程序,它连接到两个不同的服务器并在视觉上区分它们。因此我有 2x 连接连接 = ... 到“左”服务器的第一个连接对象存在于初始主线程内,因为程序将在其中一个服务器的环境中执行 => 连接对象由环境预定义并存在并在 main() 开始时存在。第二个连接对象将在程序中手动构建。

现在的问题是我使用invokeLater()将GUI代码的每一位都转移到事件调度线程。因为我使用 GUI 让用户选择第二个服务器的凭据,所以“正确”服务器的连接代码位于 GUI 内,因此位于事件调度线程中。但是,我确实需要一个线程中的两个连接对象,因为在某一时刻我必须同时使用这两个对象。

示例:

public void run() {
// Left connection object is predefined and named "contect" here

// Right connection objects is created here using a GUI
connection = new ConnectionDialog().getConnection();

Project[] projects = connection.getProjects();
ProjectDialog pd = new ProjectDialog(Diff.this, projects);
otherProject = pd.getSelectedProject();
if (otherProject == null) {
    return;
}

this.leftStore = (TemplateStoreRoot) context.requireSpecialist(StoreAgent.TYPE).getStore(Store.Type.TEMPLATESTORE);
this.rightStore = otherProject.getUserService().getTemplateStore();
this.leftSets = context.requireSpecialist(ProjectAgent.TYPE).getTemplateSets();
this.rightSets = otherProject.getUserService().getProject().getTemplateSets();
this.init();
this.setEnabled(true);
this.setVisible(true);
}

我到底该怎么做才能让这个工作成功?我将每个 GUI 代码转移到事件调度线程是否做错了?文件说我必须这样做。

谢谢!

最佳答案

您必须创建一个框架来容纳您的 UI,对吗?子类 JFrame,添加您自己的构造函数并将第一个连接对象作为参数传递。您可以将其保存在框架对象中并在其中使用它。

也就是说,如果您希望 UI 具有响应能力,则不需要在 UI 线程中执行任何冗长的计算、等待网络数据等。

关于java - Swing 线程: Event dispatch Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31986545/

相关文章:

java - 使用正则表达式匹配字符串的开头和结尾[Java]

java - NFC 应用程序在 enableForegroundDispatch 上崩溃

C++ 从多个线程访问 vector

java - 为什么 Graphics 的绘制方法不考虑笔划属性?

java - 如何正确绘制图像而不仅仅是主窗口?

java - Icon 和 ImageIcon 的区别?

java - 在 Groovy 脚本中监听 CTRL+C

java - Activity 仅在重新加载应用程序后加载首次按下的索引的数据

c++ - Boost 线程概念/问题

java - 理解 wait()