文档

Java™教程
隐藏目录
初始线程
路径: 使用Swing创建GUI
课程: Swing中的并发

初始线程

每个程序都有一组线程,应用程序的逻辑从其中一个线程开始。在标准程序中,只有一个这样的线程:调用程序类的main方法的线程。在小程序中,初始线程是构造小程序对象并调用其initstart方法的线程;这些操作可以在单个线程上执行,也可以在两个或三个不同的线程上执行,这取决于Java平台的实现。在本课程中,我们称这些线程为初始线程

在Swing程序中,初始线程没有太多要做的事情。它们最重要的工作是创建一个Runnable对象,该对象初始化GUI并将其安排在事件分派线程上执行。一旦创建了GUI,程序主要由GUI事件驱动,每个事件在事件分派线程上执行一个短任务。应用程序代码可以在事件分派线程(如果它们完成得很快,以不干扰事件处理)或工作线程(用于长时间运行的任务)上安排其他任务。

初始线程通过调用javax.swing.SwingUtilities.invokeLaterjavax.swing.SwingUtilities.invokeAndWait来安排GUI创建任务。这两种方法都接受一个参数:定义新任务的Runnable。它们的唯一区别由它们的名称指示:invokeLater仅安排任务并返回;invokeAndWait在任务完成之前等待。

您可以在Swing教程中看到这些示例:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        createAndShowGUI();
    }
});

在小程序中,GUI创建任务必须从init方法中使用invokeAndWait启动;否则,init可能在GUI创建之前返回,这可能会对启动小程序的Web浏览器造成问题。在任何其他类型的程序中,安排GUI创建任务通常是初始线程的最后一件事情,所以它无论使用invokeLater还是invokeAndWait都没有关系。

为什么初始线程不直接创建GUI?因为几乎所有创建或与Swing组件交互的代码都必须在事件分派线程上运行。这个限制在下一节中进一步讨论。


上一页: Swing中的并发性
下一页: 事件派发线程