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

  • 当前线程
  • worker 线程
  • 事件调度线程。

  • 然后,我也遇到了该声明(在文档中)-



    现在,这是什么意思?

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

    最佳答案

    这仅对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,否则它将在EDT上执行。

    顺便说一句,execute是“一劳永逸”的,并且是典型的用例(从监听器中调用它)。另一方面, get 会阻塞,并且不适合从监听器调用(这会打败SwingWorker的目的,如果需要,可在自己的线程上调用它)!

    10-07 19:33
    查看更多