a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 205|回复: 0

[专业语言] JAVA认证:介绍Swing线程相关处理

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
我们知道这将在非Swing线程中调用,因为该事件是直接在LookupManager中触发的,这将不是在Swing线程中执行。因为所有的代码功能上都是异步的(我们不必等待监听器方法允许结束后才调用其它代码),我们可以通过SwingUtilities.invokeLater()将这些代码改道到Swing线程。下面是新的方法,传入一个匿名Runnable到SwingUtilities.invokeLater():
+ n9 [' s- D; l) g) k$ J  public void lookupCompleted(final LookupEvent e) {+ G" M3 _( ^% d* F" V! ?
  //notice the threading4 q5 Y( U4 L8 g2 b
  SwingUtilities.invokeLater( new Runnable() {
4 t6 \6 ~6 M( j6 Y6 C  public void run() {
0 `/ g8 {: K. S* ^1 L! o3 ^7 E  outputTA.setText("");6 c" V, }- d# D( m
  String[] results = e.getResults();5 s5 p7 ^7 Z- w
  for (int i = 0; i < results.length; i++) {0 j) y5 w  R$ ?) g
  String result = results;8 |* G& h. a- ^. `' L8 ]  N
  outputTA.setText(outputTA.getText() + " " + result);. N: R5 C  H" x* k
  }
9 j& n! _3 U: v# \. N, p  }( P' t  a4 R  T, u0 I
  }; v3 Y7 O7 i, o, [6 Y
  );
: f: Q( X  c% O" o  }4 i  _7 a' @; _: O' I' M
  如果任何LookupListener不是在Swing线程中执行,我们可以在调用线程中执行监听器代码。作为一个原则,我们希望所有的监听器都迅速地接到通知。所以,如果你有一个监听器需要很多时间来处理自己的功能,你应该创建一个新的线程或者把耗时代码放入ThreadPool中等待执行。6 R( A+ Z9 @* k4 p; k
  最后的步骤是让LookupManager在非Swing线程中执行lookup.当前,LookupManager是在JButton的 ActionListener的Swing线程中被调用的。现在是我们做出决定的时候,或者我们在JButton的ActionListener中引入一个新的线程,或者我们可以保证lookup自己在非Swing线程中执行,自己开始一个新的线程。我选择尽可能和Swing类贴近地管理Swing线程。这有助于把所有Swing逻辑封装在一起。如果我们把Swing线程逻辑添加到LookupManager,我们将引入了一层不必要的依赖。并且,对于 LookupManager在非Swing线程环境中孵化自己的线程是完全没有必要的,比如一个非绘图的用户界面,在我们的例子中,就是Logger.产生不必要的新线程将损害到你应用的性能,而不是提高性能。LookupManager执行的很好,不管Swing线程与否——所以,我喜欢把代码集中在那儿。
) ~( I" _$ J0 o( C  现在我们需要将JButton的ActionListener执行lookup的代码放在一个非Swing线程中。我们创建一个匿名的Thread,使用一个匿名的Runnable执行这个lookup.1 [5 Z, w  L6 R! K0 ?3 m
  private void searchButton_actionPerformed() {: ~5 Q; p( Z; a# M8 v  E/ Y: W, W
  new Thread(){2 l  [9 y- W# J
  public void run() {
" a" f# S4 g# [' K+ ?  lookupManager.lookup(searchTF.getText());; l, r% `) ]" ~/ ]5 @! l" J
  }$ a: Q3 G  k* w+ r" V
  }.start();; w7 {2 b9 o0 r2 q0 I4 x
  }
$ s' u! }, T' _0 n) u6 o  这就完成了我们的Swing线程。简单地在actionPerformed()方法中添加线程,确保监听器在新的线程中执行照顾到了整个线程问题。注意,我们不用处理像第一个例子那样的任何问题。通过把时间花费在定义一个事件驱动的体系,我们在和Swing线程相关处理上节约了更多的时间。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 08:26 , Processed in 0.180245 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表