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

例如,Java Swing和Android UI都使用单线程模型,其中单个UI线程负责更新所有UI。 是什么让框架devise师select了另一个线程模型呢?

multithreadingUI模型可能会给你更多的性能,尽pipe代价是更复杂吗? 我意识到后者是一个大问题,因为线程相关的错误是讨厌的,但我想知道除了简单之外,是否还有单线程模型的其他优点?

是什么让框架devise师select了另一个线程模型呢?

从马的口中 :

AWT最初是作为普通的multithreadingJava库公开的。 但是,当Java团队看到AWT的经验以及人们遇到的僵局时,我们开始意识到我们正在做出一个我们无法保持的承诺。

这个分析在1997年Swing的devise评审中达到了高潮,当时我们回顾了AWT中的游戏状态和整体行业经验,并且我们接受了Swing团队的build议:Swing应该只支持非常有限的multithreading。

(阅读整篇文章,它详细解释了这个决定,并指出,在Xerox PARC中,甚至出现了完全相同的问题,最终转向单线程模型 – 这个地方几乎所有我们认为在CS中stream行的现代版本是30年前发明的)

multithreadingUI模型可能会给你更多的性能,尽pipe代价是更复杂吗?

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

multithreadingUI模型可能会给你更多的性能,尽pipe代价是更复杂吗?

不是在大多数情况下,而且增加的复杂性在绝大多数时间里都会造成更大的伤害。 你也必须认识到,UI框架也必须处理底层的操作系统模型。 当然,它可以绕开模型并且从程序员那里抽象出来,但是在这种情况下它是不值得的。

由multithreading更新UI ad hoc引起的错误数量将远远大于多数情况下无意义的性能增益(如果甚至有增益,线程由于locking和同步而带来相关的开销,则可能会实际上只是让性能变差了很多时间)。

在这种情况下,最好只在需要时明确使用多个线程。 大多数情况下,在一个用户界面中,您需要一个线程上的所有内容,并且如果使用多个线程,则不会获得太多的收益。 UI交互几乎不是瓶颈。

不,可能不是。 至less不是当你尝试在CPU上运行线程时。 在GPU上已经有很多不同forms的并行处理。 不是简单的GUI工作,但花式3D(阴影,reflection等)

我认为这完全是关于预防僵局。

Swing的组件不被认为是线程安全的,因为这个事件调度程序线程,它们不一定是。 如果UI是multithreading的,那么整个应用程序将不得不依赖于每一个以线程安全的方式运行的组件,如果没有的话,那么在不明确的情况下会出现死锁。

所以,这样更安全

不仅如此,Windows Forms(&.Net),GTK,Motif和其他人也select了相同的devise。 我不知道Java是否会被他们交互的底层操作系统API强制进入这个决定。 当然,SWT被Windows Forms强制进入这种情况。

欲了解更多信息,“EDT”是一个很好的开始http://en.wikipedia.org/wiki/Event_dispatching_thread

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

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

您应该阅读input(鼠标或键盘),调度事件,让他们处理和再次绘制屏幕。

尝试在multithreading的过程中做到这一点。