Java教程已经针对JDK 8编写。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及其后续版本中更新的语言功能的摘要。
请参阅JDK发行说明以获取有关所有JDK发行版的新功能、增强功能和已删除或不推荐使用选项的信息。
每个程序都有一组线程,应用程序的逻辑从其中一个线程开始。在标准程序中,只有一个这样的线程:调用程序类的main
方法的线程。在小程序中,初始线程是构造小程序对象并调用其init
和start
方法的线程;这些操作可以在单个线程上执行,也可以在两个或三个不同的线程上执行,这取决于Java平台的实现。在本课程中,我们称这些线程为初始线程。
在Swing程序中,初始线程没有太多要做的事情。它们最重要的工作是创建一个Runnable
对象,该对象初始化GUI并将其安排在事件分派线程上执行。一旦创建了GUI,程序主要由GUI事件驱动,每个事件在事件分派线程上执行一个短任务。应用程序代码可以在事件分派线程(如果它们完成得很快,以不干扰事件处理)或工作线程(用于长时间运行的任务)上安排其他任务。
初始线程通过调用javax.swing.SwingUtilities.invokeLater
或javax.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组件交互的代码都必须在事件分派线程上运行。这个限制在下一节中进一步讨论。