Android 为什么大多数UI框架都是单线程的?

Android 为什么大多数UI框架都是单线程的?,android,multithreading,swing,user-interface,Android,Multithreading,Swing,User Interface,例如,JavaSwing和AndroidUI都使用单线程模型,其中一个UI线程负责更新所有UI。是什么让框架设计者选择了一个线程模型而不是另一个 多线程UI模型是否会以更高的复杂性为代价,为您带来更高的性能?我意识到后者是一个大问题,因为与线程相关的bug是令人讨厌的,但我想知道单线程模型除了简单性之外是否还有其他优势 多线程UI模型是否会以更高的复杂性为代价,为您带来更高的性能 在大多数情况下并非如此,而增加的复杂性在绝大多数情况下弊大于利。您还必须认识到,UI框架还必须处理底层操作系统模型。

例如,JavaSwing和AndroidUI都使用单线程模型,其中一个UI线程负责更新所有UI。是什么让框架设计者选择了一个线程模型而不是另一个

多线程UI模型是否会以更高的复杂性为代价,为您带来更高的性能?我意识到后者是一个大问题,因为与线程相关的bug是令人讨厌的,但我想知道单线程模型除了简单性之外是否还有其他优势

多线程UI模型是否会以更高的复杂性为代价,为您带来更高的性能

在大多数情况下并非如此,而增加的复杂性在绝大多数情况下弊大于利。您还必须认识到,UI框架还必须处理底层操作系统模型。当然,它可以围绕模型工作,并将其从程序员那里抽象出来,但在这种情况下,它根本不值得

多线程临时更新UI所导致的错误数量将远远超过大部分无意义的性能提升。如果甚至有提升,线程本身也会因锁定和同步而带来相关开销,那么实际上,在很多时候,您可能只会使性能变差


在这种情况下,最好只在需要时显式地使用多个线程。大多数情况下,在UI中,您希望所有内容都集中在一个线程上,而使用多个线程并不会带来多大好处。UI交互几乎从来都不是瓶颈。

不,可能不是。至少当您尝试在CPU上运行线程时不是这样。在GPU上已经有很多不同形式的并行处理。不是简单的GUI工作,而是花哨的3D着色、反射等。

这是因为UI应用程序的性质

您应该读取输入鼠标或键盘,分派事件,让它们处理,然后再次绘制屏幕


尝试在多线程进程上执行此操作。

我认为这一切都是为了防止死锁

Swing的组件不被认为是线程安全的,并且它们不必是线程安全的,因为这个事件调度程序线程。如果UI是多线程的,那么整个应用程序将不得不依赖于每个组件以线程安全的方式运行,如果没有,那么死锁可能会在不清楚的情况下出现

所以,这样更安全

不仅如此,Windows窗体和.Net、GTK、Motif以及其他各种窗体都选择了相同的设计。我想知道Java是否会因为与之交互的底层OS API而被迫做出这一决定。当然,SWT是被Windows窗体强迫进入这种情况的

要了解更多信息,EDT是一个很好的起点

对于.NET,SwingWorker的等价物称为BackgroundWorker

是什么让框架设计者选择了一个线程模型而不是另一个

发件人:

AWT最初作为正常暴露 多线程Java库。但作为 Java团队观察了这种体验 带AWT和死锁以及 人们遇到的种族,我们 开始意识到我们在做一个 我们不能信守诺言

这一分析最终得出了一个结论 1997年Swing的设计审查,当时 我们回顾了AWT的游戏状态, 以及整个行业的经验, 我们接受了摇摆队的建议 建议Swing 支持非常有限 多线程

阅读全文,它详细地解释了这个决定,并指出完全相同的问题和最终移动到一个单一的线程模型甚至早在施乐帕克公司就已经发生了。在这里,几乎所有我们认为CS中流淌的现代都是在30年前发明的。 多线程用户界面模型不适用吗 可能会给您带来更高的性能 尽管代价是更加复杂


绝对不是,因为绘制GUI和处理用户操作(这是UI线程需要做的一切)不会成为任何sane 2D应用程序的瓶颈。

您已经研究过GUI框架的内部了吗?Swing并不简单,尽管它是单线程的。由于应用程序开发人员也可以这样做,这将增加很多复杂性,但好处却微乎其微。我认为性能是这方面的一个重要历史原因。锁定有开销。Java最初的AWT实际上是MT安全的,还有很多Java1.0的东西,这是有成本的。此外,在大多数UI中,用一个线程绘制屏幕通常是一种最佳实践,当然CourseGod answer除外。是的,从理论上讲,两个内核更新GUI的速度是一个内核的两倍,但这完全忽略了两个线程的同步或锁定,实际上,您将不得不执行多次。除非你在同步/锁定方面很聪明
如果不这样做,那么一旦最终使多线程模型工作起来,它的性能可能会比单线程上的同一个模型差。然后,你的框架中增加了所有的复杂性,这最终会导致SDK更难使用,从而减少平台上的应用程序。这样,整个应用程序依赖于每个组件在EDT上完成所有与GUI相关的工作,如果没有,你会得到一个损坏的GUI。真的。我想强制执行高效的EDT使用比高效的线程管理更容易。我并不认为Swing使管理变得那么容易。我发现很难记住你什么时候参加EDT,什么时候不参加。我似乎记得Groovy的SwingBuilder使它变得更容易。不知道安卓。无论如何,+1代表您的答案。在.NET中,您可以从任何线程调用Console.Read/Write。而且它很有效。您还没有真正解释为什么多线程应用程序不属于UI应用程序的性质