快速业务通道

Swing中的并发-使用SwingWorker线程模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
必要的,因为大部分Swing对象是“非线程安全的”。

可以将代码的执行想象成在事件派发线程中执行一系列短小的任务。大部分任务被事件处理方法调用,诸如ActionListener.actionPerformed。其余的任务将被程序代码编排,使用invokeLater或invokeAndWait。在事件派发线程中的任务必须能够被快速执行完成,如若不然,未经处理的事件被积压,用户界面将变得“响应迟钝”。

如果你需要确定你的代码是否是在事件派发线程中执行,可调用javax.swing.SwingUtilities.isEventDispatchThread。

3.工作线程与SwingWorker

当一个Swing程序需要执行一个长时间的任务,通常将使用一个工作线程来完成。每个任务在一个工作线程中执行,它是一个javax.swing.SwingWorker类的实例。SwingWorker类是抽象类;你必须定义它的子类来创建一个SwingWorker对象;通常使用匿名内部类来这做这些。

SwingWorker提供一些通信与控制的特征:

[1]SwingWorker的子类可以定义一个方法,done。当后台任务完成的时候,它将自动的被事件派发线程调用。

[2]SwingWorker类实现java.util.concurrent.Future。这个接口允许后台任务提供一个返回值给其他线程。该接口中的方法还提供允许撤销后台任务以及确定后台任务是被完成了还是被撤销的功能。

[3]后台任务可以通过调用SwingWorker.publish来提供中间结果,事件派发线程将会调用该方法。

[4]后台任务可以定义绑定属性。绑定属性的变化将触发事件,事件派发线程将调用事件处理程序来处理这些被触发的事件。

4.简单的后台任务

下面介绍一个示例,这个任务非常简单,但它是潜在地消耗时间的任务。TumbleItem applet导入一系列的图片文件。如果这些图片文件是通过初始线程导入的,那么将在GUI出现之前有一段延迟。如果这些图片文件是在事件派发线程中导入的,那么GUI将有可能出现临时无法响应的情况。

为了解决这些问题,TumbleItem类在它初始化时创建并执行了一个StringWorker类的实例。这个对象的doInBackground方法,在一个工作线程中执行,将图片导入一个ImageIcon数组,并且返回它的一个引用。接着done方法,在事件派发线程中执行,得到返回的引用,将其放在applet类的成员变量imgs中。这样做可以允许TumbleItem类立刻创建GUI,而不必等待图片导入完成。

下面的示例代码定义和实现了一个SwingWorker对象。

SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {    @Override    public ImageIcon[] doInBackground() {      final ImageIcon[] innerImgs = new ImageIcon[nimgs];      for (int i = 0; i < nimgs; i++) {        innerImgs[i] = loadImage(i+1);      }      return innerImgs;    }    @Override    public void done() {      //Remove the "Loading images" label.      animator.removeAll();      loopslot = -1;      try {        imgs = get();      } catch (InterruptedException ignore) {}      catch (java.util.concurrent.ExecutionException e) {        String why = null;        Throwable cause = e.getCause();        if (cause != null) {          why = cause.getMessage();        } else {          why = e.getMessage();        }        System.err.println("Error retrieving file: " + why);      }    } };

Swing中的并发-使用SwingWorker线程模式(3)

时间:2011-03-20 51cto博客 zhangjunhd

所有的继承自SwingWorker的子类都必须实现doInBackground;实现do

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号