Java和x27之间的差异;s SwingWorker和Android异步任务
我在比较Swing的Java和x27之间的差异;s SwingWorker和Android异步任务,java,android,swing,android-asynctask,swingworker,Java,Android,Swing,Android Asynctask,Swingworker,我在比较Swing的SwingWorker和Android的AsyncTask类之间的差异。Android有一个主线程/UI线程,然后生成一个后台线程(使用AsyncTask),而SwingWorker有三个线程- 当前线程 工作线程 事件调度线程 然后我也看到了这个声明(在文档中)- 通常,当前线程是事件分派线程 这是什么意思 这是否意味着Swing也只有一个线程-主线程和 甚至事件都是在同一线程上接收的或 不同的JVM实现是否不同?这只对Swing有效,Swing与Android UI编
SwingWorker
和Android的AsyncTask
类之间的差异。Android有一个主线程/UI线程,然后生成一个后台线程(使用AsyncTask
),而SwingWorker
有三个线程-
- 当前线程
- 工作线程
- 事件调度线程
不同的JVM实现是否不同?这只对Swing有效,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
是“fire-and-forget”,是典型的用例(从侦听器调用)get
另一方面是阻塞,并且不适合从侦听器调用(这会破坏SwingWorker的目的,如果需要,在您自己的线程上调用它) Swing不是java。Android为每个应用程序启动一个新的(linux)单线程进程。该线程主要负责触摸事件和绘制。Java Swing也应该如此。两者都是单线程awt模型是的,Android是单线程应用程序,这意味着所有UI操作都是在UI线程上完成的。可能需要很长时间才能响应的任何其他任务都是单独创建的。并且AsynchTask在Android运行时创建的执行器上运行。这意味着它可以运行或排队,而无需您强制它们成为工作者或执行者。虽然我有点同意上一句话,但我仍然不相信这一点。也许你可以解释得更详细一些。谢谢,它澄清了很多。我还有一些疑问,我会读更多的。如果你有更多关于这方面的信息,请发布链接。