`
superzhouych
  • 浏览: 22619 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Swing中的线程探究-1

阅读更多

Swing的线程机制


        Swing是SUN推出的轻量级的开发用户界面的工具包,最初它的设计是在单线程环境下运行的,它的执行也是单线程的,这也就是为什么我们说Swing不是多线程安全的。所以为了编写交互性更高的UI界面,必须了解其内部的线程运行机制。

        Swing程序往往包括了三种类型的线程,分别是:

        1)初始化线程(Initial Thread)

        2)事件调度线程(Event Dispatch Thread,EDT)

        3)任务线程(Work Thread)


        每个程序都从main方法开始执行,该方法一般运行在初始化线程上,初始化线程主要负责启动程序的UI界面,一旦UI界面启动完毕,初始化线程的工作便宣告结束。

        每个Swing程序都会有一个EDT,EDT主要负责绘制和更新界面,并响应用户输入。每个EDT都会负责管理一个事件队列(EventQueue),而用户每次对界面更新的请求(包括键盘鼠标事件等)都会排到事件队列中,然后等待EDT的处理。

        工作线程主要负责执行和界面无直接关系的耗时任务和输入/输出密集型操作,也即任何高染或延迟UI事件的处理都应该由任务线程来完成。

 

 

Swing编程中的注意点

 

        在编写Swing程序的时候,必须注意:

        1)不能从其他非EDT线程来访问UI组件和事件处理器,否则可能会使程序出现非线程安全问题。

        2)不能在EDT中执行耗时任务,这会使得GUI事件被阻塞在队列中而得不到处理,使程序失去响应性。


 

如何正确地启动UI界面

 

        错误的启动UI界面的方法

// 错误的启动UI界面的方法
public class MainFrame extends javax.swing.JFrame {
    // ...
    public static void main(String[] args) {
        new MainFrame().setVisible(true);
    }
}

        正确的启动UI界面的方法

// 正确的启动UI界面的方法
public class MainFrame extends javax.swing.JFrame {
    // ...
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }
}

 

 

关于SwingUtilities类

        SwingUtilities提供了最常用的invokeAndWait()方法和invokeLater()方法,其他线程通过这两个方法可以将代码放到事件队列中,当EDT进入该代码块后,就开始执行,并对UI组件进行安全修改。这两个方法又有所区别,invokeLater()方法是异步的,即EDT将将事件放到队列中就返回;而invokeAndWait()方法是同步的,即EDT将事件放到队列中等到其Runnable执行完毕才返回,所以 注意绝对不能使用EDT来调用invokeAndWait()方法,否则会导致死锁发生

 

        未完待续!

1
0
分享到:
评论
1 楼 nrxqq 2010-06-20  
不是很懂

相关推荐

    javaswing程序源码-java-book:《Java编程:综合入门》一书的源代码

    进行概述,然后介绍数据类型、运算符和控制语句的基本概念,接着讲解该语言更复杂的特性,如类、方法、继承、接口、包、异常、多线程和泛型。 第二部分(第17~21章)介绍 Swing,首先对用 Swing 进行 GUI 编程进行...

    基于java的开发源码-版Swing星际争霸游戏源代码.zip

    Swing是Java标准库中的一个部分,主要用于构建桌面应用,它提供了丰富的组件和功能来创建美观的图形界面。 【描述分析】 描述部分"基于java的开发源码-版Swing星际争霸游戏源代码.zip"与标题一致,再次确认了压缩包...

    JAVA2核心技术(中文的PDF).part1.rar

     本书是Java 2技术权威指南,全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、Javaean、Java安全模式、XML、注释、元数据等主题,同量...

    Java Threads and the Concurrency Utilities

    书末附有两个附录,第一个附录提供了这些习题的答案,第二个附录则探究了Swing图形用户界面工具包中线程的使用情况以及它所涉及的线程相关API。 书中强调了正确使用Java线程API和并发工具的重要性,因为这不仅能...

    JAVA2核心技术(中文的PDF).part2.rar

     本书是Java 2技术权威指南,全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、Javaean、Java安全模式、XML、注释、元数据等主题,同量...

    一种基于Java Swing的网络聊天室的设计与实现.pdf

    multithread技术是Java语言中的一种多线程编程技术,能够提高程序的执行效率和响应速度。在网络聊天室的设计中, multithread技术可以用于处理多个用户之间的信息传输和处理。 五、案例分析 本文提供了一个基于...

    JAVA2核心技术(中文的PDF).part3.rar

    本书是Java 2技术权威指南,全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时...

    Java中的常见事件及处理探究.zip

    在Java AWT(Abstract Window Toolkit)和Swing库中,事件处理主要通过事件监听器来实现。事件是用户或系统进行的一些操作,例如鼠标点击、键盘输入或窗口关闭等。事件监听器是实现对这些事件做出响应的对象。 1. *...

    一个贯穿Java语言教学的任务实例探究.zip

    在Java语言的教学过程中,任务实例探究是一种非常有效的学习方法,它可以帮助学生将理论知识与实际应用相结合,加深对编程概念的理解。"一个贯穿Java语言教学的任务实例探究.zip"压缩包中包含的PDF文档,很可能是为...

    java酒店管理

    在这个项目中,开发者运用了Java的Swing库来构建用户界面,Swing是Java提供的一种轻量级的图形用户界面(GUI)工具包,能够帮助开发者创建美观且功能丰富的桌面应用程序。 Java的使用确保了系统的跨平台性,无论是...

    Java综合性实验-魔板游戏.zip

    在本实验项目“Java综合性实验-魔板游戏.zip”中,我们可以深入探讨一系列与Java编程相关的知识点,尤其是针对游戏开发的...同时,这也是一个很好的机会去探究如何将理论知识应用到实际项目中,从而加深对编程的理解。

    JAVA2核心技术第7版卷2高级特性-中文版

     本书是java 2技术权威指南,全面覆盖java 2技术的高级主题,包括:多线程、集合框架、网络api、数据库编程、分布式对象等,深入探究了swing、java 2d api、javabean、java安全模式、xml、注释、元数据等主题,同时...

    五子棋源代码,虽不成熟但易懂

    - 使用Java Swing库创建用户界面,包括JFrame、JPanel等组件,实现棋盘的显示和棋子的落点选择。 - 事件监听机制:通过MouseListener和ActionListener接口处理用户的点击事件,响应棋子的放置。 3. **数据结构与...

    java lecture note(Java学习笔记)

    - 探究泛型类和泛型方法,理解类型安全性和代码复用。 #### 第九周:GUI编程与事件驱动模型 - 使用Swing组件库开发图形用户界面。 - 掌握事件监听器模式,实现用户交互。 #### 第十周:文件I/O与XML解析 - 学习...

    计算机专业毕业设计参考题目 (3).docx

    1. ASP.NET:ASP.NET是微软开发的Web应用程序框架,用于构建动态网站、Web应用和服务。设计题目可能包括但不限于: - 使用ASP.NET MVC或Web Forms开发企业级应用。 - 实现用户身份验证和授权系统。 - 利用Entity ...

    基于项目驱动的JAVA程序设计教学改革 (1).pdf

    例如,通过拼图游戏教授图形和图像类applet,使用信息管理系统项目讲解JDBC和Swing高级组件,通过网络聊天室项目学习多线程、IO流和网络编程,这样有助于学生掌握知识并理解其实际应用。 - 结合案例教学:在讲解...

    坦克大战 源码 java版本

    在这个Java版本中,我们不仅能够享受到游戏的乐趣,更能深入探究其背后的编程原理和技术实现。下面,我们将对这款Java版坦克大战的源码进行分析,探讨其中涉及的多线程和图形界面技术。 首先,我们要理解Java语言在...

    贪吃蛇 java小游戏源代码

    在这款Java小游戏的源代码中,我们可以深入探究GUI(图形用户界面)编程、事件处理、基本算法以及游戏逻辑的构建。 1. **GUI编程**:Java提供了多种库来创建GUI,其中最常用的是AWT(Abstract Window Toolkit)和...

Global site tag (gtag.js) - Google Analytics