Swing Threads:事件派发线程

时间:2015-08-13 11:10:03

标签: java multithreading swing event-dispatch-thread

目前我正在使用swing的Thread模型遇到一些重大问题。 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方法是初始Thread,程序启动时我们调用一个新的Thread(Event dispatch Thread)来启动GUI。

这是对的吗?

现在我的问题:

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

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

示例:

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代码转移到事件派遣线程来做错的吗?文件说我必须这样做。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

也就是说,如果你希望你的UI能够做出响应,你不应该在UI线程中进行任何冗长的计算,等待网络数据等。