Swing线程解决方案

开发 后端
本文阐述了如何在开发Swing应用中使用事件驱动编程,以大大简化开发、维护,并提供高灵活性。

不正确的Swing线程是运行缓慢、无响应和不稳定的Swing应用的主要原因之一。这是许多原因造成的,从开发人员对Swing单线程模型的误解,到保证正确的线程执行的困难。即使对Swing线程进行了很多努力,应用线程逻辑也是很难理解和维护的。本文阐述了如何在开发Swing应用中使用事件驱动编程,以大大简化开发、维护,并提供高灵活性。

既然我们是要简化Swing应用的线程,首先让我们来看看 Swing线程是怎么工作的,为什么它是必须的。Swing API是围绕单线程模型设计的。这意味着Swing组件必须总是通过同一个线程来修改和操纵。为什么采用单线程模型,这有很多原因,包括开发成本和同步 Swing的复杂性--这都会造成一个迟钝的API。为了达到单线程模型,有一个专门的线程用于和Swing组件交互。这个线程就是大家熟知的Swing线程,AWT(有时也发音为“ought”)线程,或者事件分派线程。在本文的下面的部分,我选用Swing线程的叫法。
既然Swing线程是和 Swing组件进行交互的唯一的线程,它就被赋予了很多责任。所有的绘制和图形,鼠标事件,组件事件,按钮事件,和所有其它事件都发生在Swing线程。因为Swing线程的工作已经非常沉重了,当太多其它工作在Swing线程中进行处理时就会发生问题。会引起这个问题的最常见的位置是在非Swing处理的地方,像发生在一个事件监听器方法中,比如JButton的ActionListener,的数据库查找。既然ActionListener的 actionPerformed()方法自动在Swing线程中执行,那么,数据库查找也将在Swing线程中执行。这将占用了Swing的工作,阻止它处理它的其它任务--像绘制,响应鼠标移动,处理按钮事件,和应用的缩放。用户以为应用死掉了,但实际上并不是这样。在适当的线程中执行代码对确保系统正常地执行非常重要。

既然我们已经看到了在适当的线程中执行Swing应用的代码是多么重要,现在让我们如何实现这些线程。我们看看将代码放入和移出Swing线程的标准机制。在讲述过程中,我将突出几个和标准机制有关的问题和难点。正如我们看到的,大部分的问题都来自于企图在异步的Swing线程模型上实现同步的代码模型。从那儿,我们将看到如何修改我们的例子到事件驱动--移植整个方式到异步模型。
通用Swing线程解决方案

让我们以一个最常用的Swing线程错误开始。我们将企图使用标准的技术来修正这个问题。在这个过程中,我们将看到实现正确的Swing线程的复杂性和常见困难。并且,注意在修正这个Swing线程问题中,许多中间的例子也是不能工作的。在例子中,我在代码失败的地方以//broken开头标出。好了,现在,让我们进入我们的例子吧。

假设我们在执行图书查找。我们有一个简单的用户界面,包括一个查找文本域,一个查找按钮,和一个输出的文本区域。不要批评我的UI设计,这个确实很丑陋,我承认。

用户输入书的标题,作者或者其它条件,然后显示一个结果的列表。下面的代码例子演示了按钮的ActionListener在同一个线程中调用 lookup()方法。在这些例子中,我使用了thread.sleep()休眠5秒来作为一个占位的外部查找。线程休眠的结果等同于一个耗时5秒的同步的服务器调用。

  1. private void searchButton_actionPerformed()  
  2. {  
  3.  outputTA.setText("Searching for: " + searchTF.getText());  
  4.  //Broken!! Too much work in the Swing  
  5.  thread String[] results = lookup(searchTF.getText());  
  6.  outputTA.setText("");  
  7.  for (int i = 0; i < results.length; i++)  
  8.  {  
  9.   String result = results[i];  
  10.   outputTA.setText(outputTA.getText() + ´´ ´´ + result);  
  11.   }  
  12. }  

【编辑推荐】

  1. 浅析Swing线程包括内容
  2. AWT或Swing混合环境中的事务处理
  3. Swing性能和Swing程序的学习
  4. 比较Swing和SWT的速度
  5. 浅谈Swing构造JList
责任编辑:佚名 来源: 机械工业出版社
相关推荐

2009-09-14 19:39:14

批量线程同步

2012-05-18 11:17:58

Java多线程

2018-12-03 12:17:27

Semptian解决方案

2012-05-27 16:21:31

IDC华为

2018-12-03 11:59:42

Inventec解决方案

2018-12-03 12:26:30

YADRO解决方案

2018-12-03 12:13:21

Mellanox解决方案

2016-03-13 17:58:57

2021-05-17 07:51:44

SimpleDateF线程安全

2012-01-17 17:34:53

JavaSwing

2011-12-09 11:13:17

2009-12-23 21:06:47

统一通信多媒体联络中心平台华为

2016-03-13 17:35:18

2017-08-02 17:23:22

AzureIoTAWS

2010-12-21 17:28:58

2010-12-21 17:38:12

2012-05-27 17:01:36

华为云教育数据

2012-05-27 18:09:33

NAG Cache华为

2010-12-21 17:39:59

2010-12-21 17:20:01

点赞
收藏

51CTO技术栈公众号