我正在比较Swing的SwingWorker
和Android的AsyncTask
类之间的差异。虽然Android有一个主线程/ UI线程,然后生成一个后台线程(使用AsyncTask
),SwingWorker
有三个涉及的线程 -
然后我也发现了声明(在文档中) -
通常,Current线程是Event Dispatch Thread。
现在,这是什么意思?
这是否意味着Swing也只有 1个线程 - 主线程和 甚至事件都在同一个线程 OR 上收到 它对于不同的JVM实现是不同的吗?
答案 0 :(得分:6)
这仅适用于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。
通常,它会响应用户的输入(例如,单击按钮)。由于对用户输入的反应(作为监听器实现)总是由Swing框架在EDT中执行,除非你碰巧从另一个线程明确地调用execute
或get
,它将在EDT上执行
顺便说一下,execute
是“即发即忘”,是典型的用例(从听众那里调用)。另一方面 get
阻止不适合从侦听器调用(它会破坏SwingWorker的目的,如果需要,可以在自己的线程上调用它)!