java - 如何为这个 CPU 密集型 Java 应用程序提供 GUI?

标签 java user-interface multithreading loops

我正在用 Java 编写一个小的遗传算法,作为一项学校作业。到目前为止,我几乎一直坚持做控制台应用程序。但是我认为用户界面对这个程序真的很有帮助,所以我想做一个。我无法弄清楚如何协调事件驱动的 GUI 和具有开始和结束的控制台应用程序。

理想情况下,我希望有一堆用于设置的文本框,然后是一个“开始”按钮。点击“开始”后,算法将开始运行,并且 GUI 将以设定的时间间隔更新最新的程序状态。如果算法不卡住 GUI 或反之亦然,我到底如何完成此操作?我不希望任何一个等待另一个。

如何让我的主循环在算法运行时不卡住 GUI?我假设它们需要在单独的线程中,但我以前从未弄乱过线程。对于这项任务来说,这似乎太复杂了,这肯定是司空见惯的事情。

最佳答案

您正在使用线程。在大多数情况下,GUI 编程要求使用线程——幸运的是,Java 的线程 API 并不太糟糕(Python 的线程 API 是基于它建模的,所以它正在做一些正确的事情)。

不过,不要被线程吓倒了——我想说,它是中级的,但每个程序员都应该理解。

有很多信息会使您倾向于反对线程。然而,GUI 应用程序是它们非常有用的一个领域。线程的反对者会让您相信事件编程模型会在这种情况下为您提供帮助,但实际上并不会。大多数说“线程很烂”的人提出的解决方案往往比线程本身更糟糕。

您可以尝试将您的解决方案整合到一个线程中,但这需要您的 CPU 密集型代码以可预测的时间间隔让步给 GUI。该解决方案糟透了。 编辑: 由于其他人建议采用这种方法,让我详细说明为什么它很糟糕:您不知道的是,GUI 中的某些内容总是在更新。当您将一个窗口移到顶部然后后退时,该窗口下方的整个区域都将失效,并且代码必须在您的进程中执行以重绘该部分。即使您非常快速地更新 GUI,这也会带来负面的用户体验,因为简单的 GUI 操作会被完全阻止。有时,当您将鼠标悬停在上方时,按钮会突出显示。用户右键单击。所有这些事情都需要 CPU 时间来实现,如果你的单独线程正在消耗你的 GA,它们就不会发生。正在执行的 GUI 代码不仅是您的代码。

这似乎是一个 very useful article on the topic .

关于该主题的两个类(class)是:

  1. Concurrency
  2. Concurrency in Swing

关于java - 如何为这个 CPU 密集型 Java 应用程序提供 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695520/

相关文章:

python - 如何从字典键设置 tkinter 组合框的值

windows - 如何删除 QTreeView 左侧的空白区域

c# - 在 C# 中,在 2 个线程之间传递数据的推荐方式是什么?

Java 2D 性能缓慢 - 调整大小

java - 仅 ListView 中的最后一项显示在 BaseAdapter 中

java - NLTK找不到java.exe(自发路径还原)

multithreading - 如何让线程在被释放之前完成其工作?

Javafx Gridpane 单元格背景颜色

Python tkinter 列表框粗体

c++ - 析构函数和异步任务