Ros*_*oss 2 java user-interface multithreading loops
我正在用Java编写一些遗传算法作为学校作业.到目前为止,我几乎坚持做控制台应用程序.但是我认为UI对这个程序真的很有帮助,所以我想制作一个.我无法弄清楚如何协调事件驱动的GUI和具有开始和结束的控制台应用程序.
理想情况下,我想要一组用于设置的文本框,然后是一个"开始"按钮.一旦你点击开始,算法将开始运行,GUI将在设定的时间间隔内更新最新的程序状态.如果没有算法冻结GUI,反之亦然,我怎么做到这一点?我不希望任何一个人等着另一个.
在算法运行时如何让主循环不冻结GUI?我假设他们需要在不同的线程中,但我以前从未搞过线程.这对于这项任务来说似乎过于复杂,这一点必须是司空见惯的.
你正在使用线程.GUI编程要求线程,在大多数情况下 - 幸运的是,Java的线程API并不太可怕(Python的模型就是它,所以它正在做正确的事情).
不过,不要被线程吓倒 - 我会说,这是中级,但是每个程序员都应该理解.
那里有很多信息会使你容易受到攻击.然而,GUI应用程序是一个非常有用的领域.线程的反对者会让你相信事件编程模型会在这种情况下帮助你,当真的,它不会.大多数人说"线程糟透"提出的解决方案通常比线程化更糟糕.
您可以尝试将解决方案整合到一个线程中,但这需要您的CPU密集型代码以可预测的时间间隔向GUI提供.那解决方案很糟糕. 编辑:由于其他人正在建议这种方法,让我详细说明为什么它很糟糕:你不知道,有些东西总是在GUI中更新.当您将窗口移到顶部然后关闭时,该窗口下的整个区域都将失效,并且代码必须在您的过程中执行- 以重绘该部分.即使您非常快速地更新GUI,这也会提供负面的用户体验,因为简单的GUI操作完全阻止.有时候鼠标悬停时会突出显示按钮.用户右键单击.所有这些都需要CPU时间来实现,如果你的孤独线程正在咀嚼你的GA,它们就不会发生.正在执行的GUI代码不仅仅是您的代码.
关于该主题的两个课程是:
对不起 - 看起来后台任务看起来很简单明了.不幸的是,Java Swing GUI线程模型有点复杂.在这方面已经有了一些改进,但是仍然需要先了解一些线程知识.
如果你有时间,我建议阅读有关肮脏富客户端中的线程- 通过SwingWorker进行无痛线程的章节.

如果您不耐烦,只需阅读SwingWorker上的JavaDoc即可.如果您真的不耐烦,只需从JavaDoc示例用法中复制life示例的含义即可.