遗留Java应用程序中的“主要事件循环”如何[JCIP 9.1]

时间:2017-02-28 21:33:33

标签: java user-interface concurrency event-loop

我在实践中阅读java concuremcy。现在我实现9.1章。但是我没有在java上开发GUI应用程序。

从书中引用:

  

为什么GUI是单线程的?

     

在过去,GUI应用程序是单线程和GUI事件   从“主要事件循环”处理。现代GUI框架使用a   模型只是略有不同:它们创建一个专门的事件   调度线程(EDT)用于处理GUI事件。

我以前不是开发人员,因此我不明白GUI应用程序中的'主事件循环'是什么意思。谷歌也没有回复我的明确解释。

你能举例说明这种传统技术吗?是否有生产和消费任务的队列?

1 个答案:

答案 0 :(得分:1)

是的,在这两种情况下都有一个等待处理任务的队列,以及一个一个地执行这些任务的线程。

主事件循环是指一个专用线程,它在一个循环中处理应用程序的所有任务,这两个任务都与UI和应用程序的所有其他方面相关,如I / O和数值计算。 这种编程模型很方便,因为它是单线程的,不需要线程同步。无论如何,在过去,计算机只有单CPU,多线程不会产生太大影响。

如今,事件调度线程(EDT)仅处理UI请求,允许I / O和数值计算并行运行。通常,这需要线程同步,但与EDT的通信仍然很简单:

SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    //Code to change Swing data.
  }
});

您仍然可以将EDT用于应用程序的所有任务,而不仅仅是UI,以防您的应用程序重量轻,而且EDT过载不会使UI变慢。