快速业务通道

Java开发中的线程安全选择与Swing - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
 JOptionPane.showMessageDialog( myMainFrame, "Hello There");}  }; SwingUtilities.invokeAndWait (showModalDialog);}

类似地,假设一个线程需要对GUI的状态进行存取,比如文本域的内容,它的代码可能类似这样:

void printTextField()  throws Exception {final String[] myStrings = new String[2];Runnable getTextFieldText = new Runnable() {  public void run() {myStrings[0] = textField0.getText();myStrings[1] = textField1.getText();  }};SwingUtilities.invokeAndWait (getTextFieldText);System.out.println(myStrings[0] + " " + myStrings[1]);}

如果你能避免使用线程,最好这样做。线程可能难于使用,并使得程序的debug更困难。一般来说,对于严格意义下的GUI工作,线程是不必要的,比如对组件属性的更新。

不管怎么说,有时候线程是必要的。下列情况是使用线程的一些典型情况:

执行一项费时的任务而不必将事件派发线程锁定。例子包括执行大量计算的情况,会导致大量类被装载的情况(如初始化),和为网络或磁盘I/O而阻塞的情况。

重复地执行一项操作,通常在两次操作间间隔一个预定的时间周期。

要等待来自客户的消息。

你可以使用两个类来帮助你实现线程:

◆SwingWorker:创建一个后台线程来执行费时的操作。

◆Timer:创建一个线程来执行或多次执行某些代码,在两次执行间间隔用户定义的延迟。

Java开发中的线程安全选择与Swing(4)

时间:2011-01-24

使用SwingWorker类

SwingWorker类在SwingWorker.java中实现,这个类并不包含在Java的任何发行版中,所以你必须单独下载它。

SwingWorker类做了所有实现一个后台线程所需的肮脏工作。虽然许多程序都不需要后台线程,后台线程在执行费时的操作时仍然是很有用的,它能提高程序的性能观感。

SwingWorker''s get() method. Here''s an example of using SwingWorker:

要使用SwingWorker类,你首先要实现它的一个子类。在子类中,你必须实现construct()方法还包含你的长时间操作。当你实例化SwingWorker的子类时,SwingWorker创建一个线程但并不启动它。你要调用你的SwingWorker对象的start()方法来启动线程,然后start()方法会调用你的construct()方法。当你需要construct()方法返回的对象时,可以调用SwingWorker类的get()方法。这是一个使用SwingWorker类的例子:

...// 在main方法中:final SwingWorker worker = new SwingWorker() { public Object construct() {return new expensiveDialogComponent();  }};worker.start();...// 在动作事件处理方法中:JOptionPane.showMessageDialog (f, worker.get());

当程序的main()方法调用start()方法,SwingWorker启动一个新的线程来实例化ExpensiveDialogComponent。main()方法还构造了由一个窗口和一个按钮组成的GUI。

当用户点击按钮,程序将阻塞,如果必要,阻塞到ExpensiveDialogComponent创建完成。然后程序显示一个包含ExpensiveDialogComponent的模式对话框。你可以在MyApplication.java找到整个程序。

使用Timer类

Timer类通过一个ActionListener来执行或多次执行一项操作。你创建定时器的时候可以指定操作执行的频率,并且你可以指定定时器的动作事件的监听者(action listener)。启动定时器后,动作监听者的actionPerformed()方法会被(多次)调用来执行操作。

定时器动作监听者(action listener)定义的actionPerformed()方法将在事件派发线程中调用。这意味着你不必在其中使用invokeLater()方法。

这是一个使用Timer类来实现动画循环的例子:

public class AnimatorApplicationTimer extends JFrame implements ActionListener {...//在这

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号