【问题标题】:Differences between Java's SwingWorker and Android AsyncTaskJava 的 SwingWorker 和 Android AsyncTask 的区别
【发布时间】:2014-12-15 10:48:21
【问题描述】:

我在比较 Swing 的 SwingWorker 和 Android 的 AsyncTask 类之间的差异。虽然 Android 有一个主线程/UI 线程,然后产生一个后台线程(使用 AsyncTask),但 SwingWorker 涉及三个线程 -

  • 当前线程
  • 工作线程
  • 事件调度线程。

然后我也看到了声明(在文档中)-

通常,当前线程是事件调度线程。

现在,这是什么意思?

这是否意味着 Swing 也只有 1 个线程 - 主线程和 甚至事件都在同一个线程上接收 OR 不同的JVM实现有区别吗?

【问题讨论】:

  • Swing 不是 java。 Android 为每个应用程序启动一个新的(linux)单线程进程。该线程主要负责触摸事件和绘图。 Java Swing 也应该如此。两者都被认为是单线程 awt 模型
  • 是的,Android 是一个单线程应用程序,这意味着所有的 UI 操作都在 UI 线程上完成。任何其他可能需要很长时间才能响应的任务都是单独创建的。
  • 并且 AsynchTask 在 Android 运行时创建的 Executor 上运行。这意味着它可以运行或排队,而无需您强制它们进入工作程序或执行程序。

标签: java android swing android-asynctask swingworker


【解决方案1】:

这仅对 Swing 有效,它与 Android UI 编程有一些相似之处,但实际上并不相同。

一点上下文

EDT(Event Dispatch Thread)是 Swing 的线程,专门用于处理 UI 事件(鼠标和键盘输入、控件上的事件、UI 的呈现等...)。 这是一个事件循环模型,类似于 Android 中所做的。

Swing 中的事件侦听器在 EDT 上执行这一事实是 Swing 应用程序中冻结 UI 的根本原因:开发人员误解线程模型经常将长时间运行的代码放在侦听器中,这会阻塞 EDT 并因此阻塞 GUI。

SwingWorker 的引入是为了更好地指导开发人员将 UI 更新与长时间运行的后台代码分开。它在doInBackground 中为I/O 处理(或长时间运行的任务)生成一个专用后台线程,并在done 和process 方法中执行UI 更新。虽然这 3 个方法保证了它们将在哪个线程中执行,但所有其他方法都在当前线程中执行。

你引用的句子是什么意思

存在 SwingWorker 的全部原因是从 GUI 正确启动长时间运行的进程,而不会阻塞 GUI。

通常,它会响应用户的输入(例如单击按钮)。由于对用户输入的反应(实现为侦听器)始终由 Swing 框架在 EDT 中执行,除非您碰巧从另一个线程显式调用 execute 或 get,否则它将在 EDT 上执行。

顺便说一句,execute 是“即发即弃”,是典型的用例(从侦听器调用它)。另一方面,get 阻塞,并且不适合从侦听器调用(它会破坏 SwingWorker 的目的,如果需要,请在您自己的线程上调用它)!

【讨论】:

  • 虽然我有点同意最后的说法,但我仍然不相信。如果你能用更多的细节解释一下。
  • 谢谢,它澄清了很多。我仍然有一些疑问,将阅读更多有关它的信息。如果您对此有更多了解,请发布链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2013-10-27
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多