文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发JavaJava开发中的线程安全选择与Swing[Z]
精品推荐
特别推荐
·实例讲解:Java中的SOAP技术
·Java语言出现的背景 影响及前景
·Java精华积累:初学者都应该搞懂的问题
·Java多媒体框架设计自动播放机实例详解
·如何有效防止Java程序源码被人偷窥?
·Cell插件在J2EE系统中的应用
·初学者想学Hibernate,初级基础教程
·Java语言实现支持视频点播的WEB服务器
·关于Java编程的中文问题的几条分析原则
·确保J2ME无线移动商业应用程序的安全性
·Java开源技术:Eclipse的使用技巧详解
·新手入门:Java中的修饰词使用方法总结
·JAVA开发者应该去的20个英文网站
·使用JDBC创建数据库访问程序
·JDK的命令详解
·Java学习从入门到精通(附FAQ)
·Tomcat性能调整
·JSF:Java中面向Web开发的生旦净末丑
·对Java语言入门初学者的一些建议
·Java技术的新方向
热点TOP10
·Java图形用户界面设计
·在桌面应用中使用JAVA DB
·3D编程指南第一部分:快速进入移动JAVA 3D编程世界
·java swing的拖放例子
·用Java编写的记事本程序(1)
·用Java编写的记事本程序(3)
·JasperReport经验谈
·图解JBuilderX安装与实践
·用java编写的小游戏源代码分析
·struts+spring+ibatis轻量级J2EE开发
·单源点最短路径Dijkstra算法的JAVA实现
·实例讲解:Java中的SOAP技术
·初学者想学Hibernate,初级基础教程
·中国农历二百年算法及年历程序分析一
·用Java实现SMTP服务器
·Java语言出现的背景 影响及前景
·Java Applet 入门第三天
·用Java编写的记事本程序(2)
·Java学习从入门到精通(附FAQ)
·通过JCA实现企业级应用程序的“即插即用”

Java开发中的线程安全选择与Swing[Z]

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]


 Swing API的设计目标是强大、灵活和易用。特别地,我们希望能让程序员们方便地建立新的Swing组件,不论是从头开始还是通过扩展我们所提供的一些组件。

  出于这个目的,我们不要求Swing组件支持多线程访问。相反,我们向组件发送请求并在单一线程中执行请求。

  本文讨论线程和Swing组件。目的不仅是为了帮助你以线程安全的方式使用Swing API,而且解释了我们为什么会选择现在这样的线程方案。

  本文包括以下内容:
   单线程规则:Swing线程在同一时刻仅能被一个线程所访问。一般来说,这个线程是事件派发线程(event-dispatching thread)。

   规则的例外:有些操作保证是线程安全的。

   事件分发:如果你需要从事件处理(event-handling)或绘制代码以外的地方访问UI,那么你可以使用SwingUtilities类的invokeLater()或invokeAndWait()方法。

   创建线程:如果你需要创建一个线程——比如用来处理一些耗费大量计算能力或受I/O能力限制的工作——你可以使用一个线程工具类如SwingWorker或Timer。

   为什么我们这样实现Swing:我们将用一些关于Swing的线程安全的背景资料来结束这篇文章。

  Swing的规则是:

  一旦Swing组件被具现化(realized),所有可能影响或依赖于组件状态的代码都应该在事件派发线程中执行。

  这个规则可能听起来有点吓人,但对许多简单的程序来说,你用不着为线程问题操心。在我们深入如何撰写Swing代码之前,让我们先来定义两个术语:具现化(realized)和事件派发线程(event-dispatching thread)。

  具现化的意思是组建的paint()方法已经或可能会被调用。一个作为顶级窗口的Swing组件当调用以下方法时将被具现化:setVisible (true)、show()或(可能令你惊奇)pack()。当一个窗口被具现化,它包含的所有组件都被具现化。另一个具现化一个组件的方法是将它放入到一个已经具现化的容器中。稍后你会看到一些对组件具现化的例子。

  事件派发线程是执行绘制和事件处理的线程。例如,paint()和actionPerformed()方法会自动在事件派发线程中执行。另一个将代码放到事件派发线程中执行的方法是使用SwingUtilities类的invokeLater()方法。

  所有可能影响一个已具现化的Swing组件的代码都必须在事件派发线程中执行。但这个规则有一些例外:

  有些方法是线程安全的:在Swing API的文档中,线程安全的方法用以下文字标记:

  This method is thread safe, although most Swing methods are not.
  (这个方法是线程安全的,尽管大多数Swing方法都不是。)

一个应用程序的GUI常常可以在主线程中构建和显示:下面的典型代码是安全的,只要没有(Swing或其他)组件被具现化:

public class MyApplication
{
 public static void main(String[] args)
 {
  JFrame f = new JFrame("Labels"); // 在这里将各组件
   // 加入到主框架……
   f.pack();
   f.show();
   // 不要再做任何GUI工作……
  }
}

  上面所示的代码全部在“main”线程中运行。对f.pack()的调用使得JFrame以下的组件都被具现化。这意味着,f.show()调用是不安全的且应该在事件派发线程中执行。尽管如此,只要程序还没有一个看得到的GUI,JFrame或它的里面的组件就几乎不可能在f.show()返回前收到一个paint()调用。因为在f.show()调用之后不再有任何GUI代码,于是所有GUI工作都从主线程转到了事件派发线程,因此前面所讨论的代码实际上是线程安全的。

  一个applet的GUI可以在init()方法中构造和显示:现有的浏览器都不会在一个applet的 init()和start()方法被调用前绘制它。因而,在一个applet的init()方法中构造GUI是安全的,只要你不对applet中的对象调用show()或setVisible(true)方法。

  要顺便一提的是,如果applet中使用了Swing组件,就必须实现为 JApplet的子类。并且,组件应该添加到的JApplet内容窗格(content pane)中,而不要直接添加到JApplet。对任何applet,你都不应该在init()或start()方法中执行费时的初始化操作;而应该启动一个线程来执行费时的任务。

  下述JComponent方法是安全的,可以从任何线程调用:repaint()、revalidate ()、和invalidate()。repaint()和revalidate()方法为事件派发线程对请求排队,并分别调用paint()和 validate()方法。invalidate()方法只在需要确认时标记一个组件和它的所有直接祖先。

  监听者列表可以由任何线程修改:调用addListenerTypeListener()和removeListenerTypeListener()方法总是安全的。对监听者列表的添加/删除操作不会对进行中的事件派发有任何影响。

[1] [2] [3] [4] 下一页 




上一篇:java中Properties类的使用

下一篇:如何在Java程序中运行外部类文件

Java开发中的线程安全选择与Swing[Z] 相关文章:
·IE浏览器再现严重安全漏洞 微软紧急发补丁程序
·不怕攻击 家庭上网必学八招安全绝招
·中小企业整体网络安全解决方案解析
·基础知识 初级黑客安全技术命令详解
·EZ-USB 68013A开发指南
·Java图形用户界面设计
·Visual Studio 2005集成开发环境图解
·如何以安全模式启动计算机
·Windows 2003安全设置大全-IIS、终端服务、FTP、SQL的配置
·javascript+xml实现二级下拉菜单,不会被任何标签或元素遮住
Java开发中的线程安全选择与Swing[Z] 相关软件:
·孙鑫VC++从入门到精通开发详解视频教程FLASH版
·Kaspersky(卡巴斯基) Internet Security 安全套装 V6.0.2.621 中文版
·中国少年儿童智力开发百科全书(上中下)高清PDF全彩图书
·如何加固Windows XP 主机安全
·2007网络安全黄皮书V1.0.0
·美萍安全卫士v12.3
·温瑞安全集
·防骗 安全教育片
·Thinking In Java 英文版
·360安全卫士v3.2

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot