为什么选择 SwingWorker?为什么不只是 Thread 或 Runnable?
2022-09-02 23:13:10
使用代替 或 的优点是什么?SwingWorker
Thread
Runnable
使用代替 或 的优点是什么?SwingWorker
Thread
Runnable
我认为SwingWorker的文档非常好:
一个抽象类,用于在专用线程中执行冗长的 GUI 交互任务。
使用 Swing 编写多线程应用程序时,需要记住两个约束:(有关更多详细信息,请参阅如何使用线程):
- 不应在事件调度线程上运行耗时的任务。否则,应用程序将无响应。
- 只能在事件调度线程上访问 Swing 组件。
这些约束意味着具有时间密集型计算的 GUI 应用程序至少需要两个线程:1) 一个线程来执行冗长的任务,2) 事件调度线程 (EDT) 用于所有与 GUI 相关的活动。这涉及线程间通信,实现起来可能很棘手。
SwingWorker 专为以下情况而设计:您需要在后台线程中运行长时间运行的任务,并在完成后或在处理时向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法来执行后台计算。
当然,您可以使用Thread,Runtime和SwingUtilities()来执行此操作,但是使用SwingWorker类更容易,并且可能更不容易出错。invokeLater
Thread和Runnable是Java 1.0的一部分;他们和当时一样好。
新的并发类提炼了从那时起所学到的关于多线程的所有知识(谢谢你,Doug Lea和其他人)。编写多线程代码非常困难。新的并发类(包括 SwingWorker)试图使这更容易。
首先记下强类型的泛型。内置了一种机制来发布和处理最终和中间结果。
可以用Thread和Runnable来模仿这些,但是SwingWorker已经为你做到了。