快速业务通道

Swing中的并发-使用SwingWorker线程模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
ne方法是可选的。

注意,SwingWorker是一个范型类,有两个参数。第一个类型参数指定doInBackground的返回类型。同时也是get方法的类型,它可以被其他线程调用以获得来自于doInBackground的返回值。第二个类型参数指定中间结果的类型,这个例子没有返回中间结果,所以设为void。

使用get方法,可以使对象imgs的引用(在工作线程中创建)在事件派发线程中得到使用。这样就可以在线程之间共享对象。

实际上有两个方法来得到doInBackground类返回的对象。

[1]调用SwingWorker.get没有参数。如果后台任务没有完成,get方法将阻塞直到它完成。

[2]调用SwingWorker.get带参数指定timeout。如果后台任务没有完成,阻塞直到它完成-除非timeout期满,在这种情况下,get将抛出java.util.concurrent.TimeoutException。

5.具有中间结果的任务

让一个正在工作的后台任务提供中间结果是很有用处的。后台任务可以调用SwingWorker.publish方法来做到这个。这个方法接受许多参数。每个参数必须是由SwingWorker的第二个类型参数指定的一种。

可以覆盖(override)SwingWorker.process来保存由publish方法提供的结果。这个方法是由事件派发线程调用的。来自publish方法的结果集通常是由一个process方法收集的。

我们看一下Filpper.java提供的实例。这个程序通过一个后台任务产生一系列的随机布尔值测试java.util.Random。就好比是一个投硬币试验。为了报告它的结果,后台任务使用了一个对象FlipPair。

private static class FlipPair {    private final long heads, total;    FlipPair(long heads, long total) {      this.heads = heads;      this.total = total;    } }

heads表示true的结果;total表示总的投掷次数。

后台程序是一个FilpTask的实例:

private class FlipTask extends SwingWorker<Void, FlipPair> {

因为任务没有返回一个最终结果,这里不需要指定第一个类型参数是什么,使用Void。在每次“投掷”后任务调用publish:

@Override

protected Void doInBackground() {    long heads = 0;    long total = 0;    Random random = new Random();    while (!isCancelled()) {      total++;      if (random.nextBoolean()) {        heads++;      }      publish(new FlipPair(heads, total));    }    return null; }

由于publish时常被调用,许多的FlipPair值将在process方法被事件派发线程调用之前被收集;process仅仅关注每次返回的最后一组值,使用它来更新GUI:

protected void process(List pairs) {    FlipPair pair = pairs.get(pairs.size() - 1);    headsText.setText(String.format("%d", pair.heads));    totalText.setText(String.format("%d", pair.total));    devText.setText(String.format("%.10g",        ((double) pair.heads)/((double) pair.total) - 0.5)); }

Swing中的并发-使用SwingWorker线程模式(4)

时间:2011-03-20 51cto博客 zhangjunhd

6.取消后台任务

调用SwingWorker.cancel来取消一个正在执行的后台任务。任务必须与它自己的撤销机制一致。有两个方法来做到这一点:

[1]当收到一个interrupt时,将被终止。

[2]调用SwingWorker.isCanceled,如果SwingWorker调用cancel,该方法将返回true。

7.绑定属性和状态方法

SwingWorker支持bound properties,这个在与其他线程通信时很有作用。提供两个绑定属性:progress和state。progress和state可以用于触发在事件派发线程中的事件处理任务。

通过实现一个property change listener,程序可以捕捉到progress,s

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号