yad*_*_vi 6 java swing android swingworker android-asynctask
我正在比较Swing SwingWorker
和Android的AsyncTask
类之间的差异.虽然Android有一个主线程/ UI线程,然后产生一个后台线程(使用AsyncTask
),SwingWorker
有三个涉及的线程 -
然后我也发现了声明(在文档中) -
通常,Current线程是Event Dispatch Thread.
现在,这是什么意思?
这是否意味着Swing也只有1个线程 - 主线程甚至事件都在同一个线程上接收或者 它对于不同的JVM实现是否不同?
这仅适用于Swing,它与Android UI编程有一些相似之处,但实际上并不相同.
EDT(事件调度线程)是Swing的线程,专门用于处理UI事件(鼠标和键盘输入,控件上的事件,UI的呈现等).这是一个事件循环模型,类似于Android中的模型.
Swing中的事件侦听器在EDT上执行的事实是在Swing应用程序中冻结UI的根本原因:开发人员误解线程模型通常会在侦听器中放置长时间运行的代码,从而阻止EDT,从而阻止GUI.
SwingWorker
之前介绍的是更好地指导开发人员将UI更新与长时间运行的后台代码分开.它为I/O处理(或长时间运行的任务)生成一个专用的后台线程,doInBackground
并在done
和process
方法中执行UI更新.虽然这3个方法保证了它们将在哪个线程中执行,但所有其他方法都在当前线程中执行.
SwingWorker存在的全部原因是从GUI正确启动长时间运行的进程,而不会阻止GUI.
通常,它会响应用户的输入(例如,单击按钮).由于对用户输入的反应(作为监听器实现)总是由Swing框架在EDT中执行,除非你碰巧调用execute
或get
明确地从另一个线程调用,它将在EDT上执行.
顺便说一句,execute
是"即发即忘",是典型的用例(从听众那里称呼它).get
另一方面是块,并且不适合从监听器调用(它会破坏SwingWorker的用途,如果需要,可以在你自己的线程上调用它)!
归档时间: |
|
查看次数: |
1026 次 |
最近记录: |