SwingWorker,多线程开发swing必备类,很多时候不用它界面会挂掉

在专用线程中执行长时间 GUI 交互任务的抽象类。

使用 Swing 编写多线程应用程序时,要记住两个约束条件:

       1、不应该在事件指派线程 上运行耗时任务。否则应用程序将无响应。

       2、只能在事件指派线程 上访问 Swing 组件。

这些约束意味着需要时间密集计算操作的 GUI 应用程序至少需要以下两个线程:1) 执行长时间任务的线程; 2) 所有 GUI 相关活动的事件指派线程 (EDT)这涉及到难以实现的线程间通信。

SwingWorker 设计用于需要在后台线程中运行长时间运行任务的情况,并可在完成后或者在处理过程中向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法,以执行后台计算。

工作流

SwingWorker 的生命周期中包含三个线程:

  • 当前 线程:在此线程上调用 execute() 方法。它调度 SwingWorker 以在 worker 线程上执行并立即返回。可以使用 get 方法等待 SwingWorker 完成。

  • Worker 线程:在此线程上调用 doInBackground() 方法。所有后台活动都应该在此线程上发生。要通知 PropertyChangeListeners 有关绑定 (bound) 属性的更改,请使用 firePropertyChange getPropertyChangeSupport() 方法。默认情况下,有两个可用的绑定属性:stateprogress

  • 事件指派线程:所有与 Swing 有关的活动都在此线程上发生。SwingWorker 调用 processdone() 方法,并通知此线程的所有 PropertyChangeListener

通常,当前 线程就是事件指派线程

worker 线程上调用 doInBackground 方法之前,SwingWorker 通知所有 PropertyChangeListener 有关对 StateValue.STARTEDstate 属性更改。doInBackground 方法完成后,执行 done 方法。然后 SwingWorker 通知所有 PropertyChangeListener 有关对 StateValue.DONEstate 属性更改。

SwingWorker 被设计为只执行一次。多次执行 SwingWorker 将不会调用两次 doInBackground 方法。

按照上面的书法,扩展类调用execute() 方法,应该是启动一个新的线程用的,然后在转到doInBackground() 方法去执行你那个比较耗时的操作,紧接着,做完了之后,在去做process 或 done()方法,注意,process一般来处理像不停输出中间结果的问题较有用,done就是你做完了之后更新UI即可,你要混着用,也没事。另外还有一点就是,他里面有个属性  private volatile int progress; ,这个属性它可以被绑定一个相应事件上,如下:

public final void addPropertyChangeListener(PropertyChangeListener listener) {
        getPropertyChangeSupport().addPropertyChangeListener(listener);
    }

这样,你如果在一个循环中去做一件比较耗时的事情,循环很长,使用着需要知道还要等多久,你就可以用这个去计时了,比如,循环有10000次,每一次你都将progress的重设置一次,这样进度条就会更这往前跑了。然后人家就知道我还需要等多久出结果。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值