SwingWorker()构造器的线程

开发 后端
本文介绍SwingWorker()构造器的线程,SwingWorker是作为一个Runnable被QueuedExecutor执行的。

演示程序用SwingWorker()构造器在后台执行费时的操作,然后更新UI。
这个演示程序所用的SwingWorker是基于《使用SwingWorker线程》文中提出的SwingWorker类,但重新实现了它以修正一处竞态条件,添加超时支持,和改进了异常处理。
这个新的实现还基于DougLea的util.concurrent包的FutureResult类(参见“参考资料”一节)。由于大量依赖了FutureResult所做的工作,SwingWorker类的实现是简单而灵活的。
本节的余下部分更详细地描述了实现的细节,请继续往下看或直接跳到后面下载源码。
RunnableFutureResult

FutureResult,正如它的名字所暗示的,它是用来保持某动作的结果的。它被设计成和一个Callable共同使用,Callable是一个会返回结果的runnable动作:

  1. publicinterfaceCallable{  
  2. Objectcall()throwsException;  

新的SwingWorker是一个RunnableFutureResult。在运行时,它把结果设成construct()的返回值,然后在事件派发线程中调用finished()方法。(注意:SwingWorker是一个抽象类;你要子类化它并实现construct()和finished()。)
下面的代码来自SwingWorker的run()方法:

  1. Callablefunction=newCallable(){  
  2. publicObjectcall()throwsException{  
  3. returnconstruct();  
  4. }  
  5. }; 

 

  1. RunnabledoFinished=newRunnable(){  
  2. publicvoidrun(){  
  3. finished();  
  4. }  
  5. };  
  6.  
  7. setter(function).run();  
  8. SwingUtilities.invokeLater(doFinished); 

***段把construct()转换成一个Callable动作,第二段把finished()转换成作为Runnable的doFinished。然后setter(function)被运行,doFinished被调用。
setter(function)

上面缺少的部分是setter(function)。它创建一个刻板的Runnable。在运行时,这个Runnable调用参数指定的function,然后给结果设置返回值。下面是来自FutureResult的代码:

  1. publicRunnablesetter(finalCallablefunction){  
  2. returnnewRunnable(){  
  3. publicvoidrun(){  
  4. try{  
  5. set(function.call());  
  6. }  
  7. catch(Throwableex){  
  8. setException(ex);  
  9. }  
  10. }  
  11. };  

注意try-catch块所作的防护。如果construct()抛出任何东西(Exception、Error等等),都会被捕捉并记录下来。
不要抢跑:先construct,再start

调用start()来启动worker线程。这是修订版的SwingWorker和原来版本的一个重要区别。
在原来的版本中,SwingWorker()构造器自动启动线程,这种做法带来了一个线程和子类构造器竞争的危险:当SwingWorker()构造器已启动了线程,而子类的构造器还没完成。弥补方法是,先构造SwingWorker,然后再调用start()。
顺便一提,RemoteTable并不调用start()。正确来说,SwingWorker是作为一个Runnable被QueuedExecutor执行的。

【编辑推荐】

  1. 介绍JavaFX功能与Swing的关系
  2. 浅谈Swing中lookandfeel源代码
  3. 概述Swing中的Timer对象
  4. 浅析Swing中actionPerformed()方法
  5. 详解所有的Swing核心组件
责任编辑:佚名 来源: cnblogs
相关推荐

2009-07-10 09:05:20

SwingWorker

2009-07-10 09:30:41

SwingWorker

2009-07-17 10:58:12

SwingWorker

2009-07-17 17:47:39

SwingWorker

2009-10-12 13:32:58

VB.NET线程构造器

2009-07-21 12:35:00

Scala从构造器

2009-07-17 17:34:03

SwingWorker异常处理

2009-07-17 14:57:41

SwingWorkerSwing程序

2012-05-16 13:45:24

Java构造器

2011-05-16 10:35:02

jQuery

2019-10-22 08:45:07

Java构造器编程语言

2017-04-17 08:44:43

构造函数线程安全

2012-02-27 14:09:00

Java

2022-04-15 08:30:00

Lombok@Builde构建器

2009-04-30 09:10:42

JavaSwing线程安全

2010-01-18 10:28:15

C++编译器

2009-12-17 10:18:17

Ruby创建构造器

2013-05-06 09:59:48

2016-09-02 09:14:26

2013-06-08 13:07:23

Java线程池调度器
点赞
收藏

51CTO技术栈公众号