首页 > 范文大全 > 正文

Swing可视化组件多线程操作机制研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇Swing可视化组件多线程操作机制研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:介绍了swing可视化组件,探讨了使用Swing组件开发界面时的线程问题,从原理上阐述Swing的线程机制,分析Swing的事件派发线程的处理过程,对Swing对耗时任务的多线程处理方法进行研究,结合实例给出解决策略,并说明了基于SwingWorker的操作

关键词:Swing;多线程;事件队列;SwingWorker

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2012)31-7481-02

Swing 是为Java设计的可视化工具包,是JAVA基础类的一部分。它包括了多种图形用户界面器件,Swing是轻量级元件,用纯Java写成,因而可以跨平台运行。开发者可以方便地利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

Java是一个高度多线程环境。Swing在处理界面组件时,被设计成单线程操作,以避免线程安全问题。而图形化界面如果只采用顺序编程,可能会出现等待长时间任务执行而造成响应问题,这是不可接受的。因此,合理的多线程操作对于Swing至关重要,正确理解和使用Swing线程模型编程,是编写响应灵活的Swing程序的关键。

1 Swing线程设计

1.1 Swing的线程操作

Swing操作界面时,需要调用与操作系统直接交互的底层代码,由于这些代码不可被重复调用,因此它是线程不安全的。

Swing中包括两类线程。第一类是初始线程(Initial Threads),此类线程将执行初始化应用代码。第二类是事件派发线程(The event dispatch thread,EDT),所有的事件处理代码在这里执行。

Main方法运行在初始化线程上。初始化线程读取程序参数并初始化对象,启动程序的图形用户界面。而图形界面启动后,初始化线程工作基本结束。

Swing程序只有一个事件派发线程,该线程负责GUI组件的绘制和更新,通过调用程序的事件处理器来响应用户交互。由于所有事件处理都是在事件派发线程上进行,包括程序同界面组件等的交互,因此所有其上的任务应该尽快完成,以便界面能及时响应用户输入。

1.2 事件派发线程更新界面组件

在事件派发线程中执行代码有两种方法:SwingUtiinlities下的静态方法invokeAndWait()和invokeLater()。它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。invokeLater()方法会立即返回,不等待事件派发线程执行指定代码, invokeAndWait()方法会等事件派发线程执行了指定代码才返回。

这里分析事件派发线程更新组件的机制。首先,创建一个Runnable对象,它的run()方法完成组件的状态更新操作。SwingUtilities接受该对象,将其传给SystemEventQueueUtilities类。该类将Runnable对象包装后添加到系统事件队列,运行这个事件时,run()方法被执行。

2 Swing同步与多线程策略

Swing事件的处理代码在单独的事件派发线程中执行。因此遇到耗时任务时,不可直接放在事件派发线程中执行,否则响应迟钝界面会卡住。对于耗时任务,需要新的一个线程来处理。

由于系统事件队列采用单一线程来执行事件,因此Swing的同步解决策略,就是长时间的任务调用,用一个后台线程,在事件队列处理之外来处理,这里给出方案代码。