gpt4 book ai didi

java - Java的SwingWorker和Android的AsyncTask的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:32 25 4
gpt4 key购买 nike

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

  • 当前线程
  • 工作线程
  • 事件派发线程。

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

Often, the Current thread is the Event Dispatch Thread.

现在,这是什么意思?

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

最佳答案

这只对Swing有效,Swing与Android UI编程有一些相似之处,但又不尽相同。

一点背景

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

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

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

你引用的那句话是什么意思

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

通常,它会响应用户的输入(例如单击按钮)。由于对用户输入的 react (作为监听器实现)始终由 Swing 框架在 EDT 中执行,除非您碰巧从另一个线程显式调用 executeget,它将在美国东部时间执行。

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

关于java - Java的SwingWorker和Android的AsyncTask的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com