Swing中的并发-使用SwingWorker线程模式 - 编程入门网
Swing中的并发-使用SwingWorker线程模式时间:2011-03-20 51cto博客 zhangjunhd本文介绍Java SE 6中的SwingWorker线程工作模式,翻译Concurrency in Swing(http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html)。 author: ZJ 2007-7-16 Blog: http://zhangjunhd.blog.51cto.com/ 本文将讨论并发机制在Swing编程中的应用。 谨慎地使用并发机制对Swing开发人员来说非常重要。一个好的Swing程序使用并发机制来创建不会失去响应的用户接口-不管是什么样的用户交互,程序总能够对其给出响应。创建一个有响应的程序,开发人员必须学会如何在Swing框架中使用多线程。 一个Swing开发人员将会与下面几类线程打交道: [1]Initial threads(初始线程),此类线程将执行初始化应用代码。 [2]The event dispatch thread(事件派发线程),所有的事件处理代码在这里执行。大多数与Swing框架交互的代码也必须执行这个线程。 [3]Worker threads(工作线程),也称作background threads(后台线程),此类线程将执行所有消耗时间的任务。 开发人员不需要在代码中显式的创建这些线程:它们是由runtime或Swing框架提供的。开发人员的工作就是利用这些线程来创建具有响应的,持久的Swing程序。 如同所有其他在Java平台上运行的程序,一个Swing程序可以创建额外的线程和线程池,这需要使用本文即将介绍的方法。本文将介绍以上这三种线程。工作线程的讨论将涉及到使用javax.swing.SwingWorker类。这个类有许多有用的特性,包括在工作线程任务与其他线程任务之间的通信与协作。 1.初始线程 每个程序都会在应用逻辑开始时生成一系列的线程。在标准的程序中,只有一个这样的线程:这个线程将调用程序主类中的main方法。在applet中初始线程是applet对象的构造子,它将调用init方法;这些actions可能在一个单一的线程中执行,或在两个或三个不同的线程中,这些都依据Java平台的具体实现。在本文中,我们称这类线程为初始线程(initial threads)。 在Swing程序中,初始线程没有很多事情要做。它们最基本的任务是创建一个Runnable对象,用于初始化GUI以及为那些用于执行事件派发线程中的事件的对象编排顺序。一旦GUI被创建,程序将主要由GUI事件驱动,其中的每个事件驱动将引起一个在事件派发线程中事件的执行。程序代码可以编排额外的任务给事件驱动线程(前提是它们会被很快的执行,这样才不会干扰事件的处理)或创建工作线程(用于执行消耗时间的任务)。 一个初始线程编排GUI创建任务是通过调用javax.swing.SwingUtilities.invokeLater或javax.swing.SwingUtilities.invokeAndWait。这两个方法都带有一个唯一的参数:Runnable用于定义新的任务。它们唯一的区别是:invokerLater仅仅编排任务并返回;invokeAndWait将等待任务执行完毕才返回。 看下面示例:
在applet中,创建GUI的任务必须被放入init方法中并且使用invokeAndWait;否则,初始过程将有可能在GUI创建完之前完成,这样将有可能出现问题。在其他的情况下,编排GUI创建任务通常是初始线程中最后一个被执行的,所以使用invokeLater或invokeAndWait都可以。 为什么初始线程不直接创建GUI?因为几乎所有的用于创建和交互Swing组件的代码必须在事件派发线程中执行。这个约束将在下文中讨论。 Swing中的并发-使用SwingWorker线程模式(2)时间:2011-03-20 51cto博客 zhangjunhd2.事件派发线程 Swing事件的处理代码在一个特殊的线程中执行,这个线程被称为事件派发线程。大部分调用Swing方法的代码都在这个线程中被执行。这样做是 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |