Java 为什么是SwingWorker?为什么不只是线程或可运行?
使用Java 为什么是SwingWorker?为什么不只是线程或可运行?,java,swingworker,Java,Swingworker,使用SwingWorker而不是Thread或Runnable有什么好处?SwingWorker会在运行任务时或任务完成后处理一些细节,如UI更新。这些必须在Swing EDT线程上执行。你可以自己做,但做错事太容易了。线程和Runnable是Java1.0的一部分;他们和当时一样好 新的并发类提取了自那时以来关于多线程的所有知识(谢谢Doug Lea和其他人)。编写多线程代码非常困难。新的并发类,包括SwingWorker,试图让这变得更容易 首先注意强类型的泛型。内置了一种机制来发布和处理最
SwingWorker
而不是Thread
或Runnable
有什么好处?SwingWorker会在运行任务时或任务完成后处理一些细节,如UI更新。这些必须在Swing EDT线程上执行。你可以自己做,但做错事太容易了。线程和Runnable是Java1.0的一部分;他们和当时一样好
新的并发类提取了自那时以来关于多线程的所有知识(谢谢Doug Lea和其他人)。编写多线程代码非常困难。新的并发类,包括SwingWorker,试图让这变得更容易
首先注意强类型的泛型。内置了一种机制来发布和处理最终和中间结果
可以用Thread和Runnable来模拟这些,但SwingWorker已经为您完成了。我认为的文档非常好: 一个抽象类,用于执行冗长的 GUI在专用环境中交互任务 线 在编写多线程 使用Swing的应用程序有两种 要记住的约束条件:(参考 如需了解更多详细信息):
- 不应在事件分派线程上运行耗时的任务。 否则,应用程序将变为 反应迟钝
- 应在事件分派线程上访问Swing组件 只是
当然,您可以使用线程、运行时和SwingUtilities(
invokeLater
)来实现这一点,但是使用SwingWorker类更容易,而且可能更不容易出错。SwingWorker
封装了与事件调度线程的正确交互<代码>可运行的没有。SwingWorker真的是新并发类的一部分吗?我认为这是Swing API的一部分,使用它的主要原因是因为事件调度线程(EDT)的约束,而不是并发包的一部分,但我会以同样的精神考虑它。可能是错的。