可能这很简单,我正在努力了解有关SwingWorker的简单文档。
这是复制粘贴的内容
工作流程
SwingWorker的生命周期涉及三个线程:
当前线程:在此线程上调用execute()方法。它调度SwingWorker在工作线程上执行并立即返回。您可以使用get方法等待SwingWorker完成。
辅助线程:在此线程上调用doInBackground()方法。这是所有后台活动都应该发生的地方。要通知PropertyChangeListener有关绑定属性的更改,请使用firePropertyChange和getPropertyChangeSupport()方法。默认情况下,有两个可用的绑定属性:状态和进度。
事件调度线程:所有与Swing相关的活动都在此线程上发生。SwingWorker调用process和done()方法,并通知此线程上的所有PropertyChangeListeners。
通常,当前线程是事件调度线程。
-
工作线程不是EDT,因此doInBackground()中的代码不得访问GUI元素。我的理解正确吗?
背景:我们有一些使用SwingWorker的小代码,但是有doInBackground()创建FileChooser并调用setCurrentDirectory()
。我怀疑这导致我与http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181几乎一样的异常(11封闭,没有缺陷)
是。从后台线程-常规线程和SwingWorker.doInBackground
您都不得修改UI以避免各种麻烦。
相反,包装在一个变化Runnable
,并让它们通过在EDT执行SwingUtilities.invokeAndWait
,SwingUtilities.invokeLater
或-使用时SwingWorker
-通过publish
(从doInBackground
)。在EDT执行的process
方法中SwingWorker
,您可以访问GUI。
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
就个人而言,我觉得invokeLater
和invokeAndWait
更容易使用的许多情况。SwingWorker可以处理进度条。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句