我正在比较Swing的SwingWorker
和Android的AsyncTask
类之间的差异。 Android有一个主线程/UI线程,然后生成一个后台线程(使用AsyncTask
),而SwingWorker
涉及到三个线程-
然后,我也遇到了该声明(在文档中)-
现在,这是什么意思?
这是否意味着Swing也只有1个线程-主线程和
即使事件是在同一线程或上接收的
不同的JVM实现是否有所不同?
最佳答案
这仅对Swing有效,后者与Android UI编程具有一些相似之处,但实际上并不相同。
一点背景
EDT(事件调度线程)是Swing的线程,专用于处理UI事件(鼠标和键盘输入,控件上的事件,UI的呈现等)。
这是一个事件循环模型,类似于Android中所做的事情。
Swing中的事件监听器是在EDT上执行的事实是卡住Swing应用程序中的UI的根本原因:开发人员对线程模型的误解常常将长时间运行的代码放入监听器中,从而阻塞了EDT,从而阻塞了GUI。
引入SwingWorker
可以更好地指导开发人员将UI更新与长期运行的后台代码分开。它在doInBackground
中产生用于I/O处理(或长时间运行的任务)的专用后台线程,并在done
和process
方法中执行UI更新。虽然这3种方法保证它们将在哪个线程中执行,但所有其他方法都在当前线程中执行。
你引用的句子是什么意思
存在SwingWorker的全部原因是从GUI正确启动了长时间运行的进程,而又没有阻塞GUI。
通常,它是对用户输入的 react (例如,单击按钮)。由于对用户输入(作为监听器实现)的响应始终由Swing框架在EDT中执行,除非您碰巧从另一个线程显式调用execute
或get
,否则它将在EDT上执行。
顺便说一句,execute
是“一劳永逸”的,并且是典型的用例(从监听器中调用它)。另一方面, get
会阻塞,并且不适合从监听器调用(这会打败SwingWorker的目的,如果需要,可在自己的线程上调用它)!