学习案例: 我有一个程序,其中包含一些模型类和Swing中的一些GUI类,其中我使用了两个线程中的多个线程,每个线程为每个可运行的线程运行不同的睡眠间隔。两个模型线程运行非常关键的工作,其中如果延迟从40ms上升到60ms将不再正确工作,所以它们非常关键。SwingUtilities.invokeLater(runnable)和Swing Timer如何工作?
但是我对GUI数以百计的分立元件必须在不到一秒钟或更频繁地更新。这些组件不能使用观察者设计模式进行更新,因为它们不仅仅反映模型中的更改。他们应该计算诸如剩余时间之类的东西。
问题
- 我认为它不会是有效地使用数百
Runnable
小号 与SwingUtilities.invokeLater(runnable)
调用来更新所有 GUI组件。因为上下文切换会产生巨大的副作用。所以我要避免它。我真的应该避免 创建所有这些可运行或invokeLater()
或swing timer
并不运行它们作为一个线程,具有即使所有的Thread.sleep(500)
它们之间的优化方法? - 为了解决上述问题,我决定与更新方法创建一个接口SwingUpdatable。并创建一个运行evry 500ms的SingleTonSwingUpdater,并运行注册它的类的所有更新方法。观察者的设计模式让我思考这个想法。但我担心这将是一种反模式。我不确定它是否会降低程序的灵活性。
- 如果我使用什么样的挥杆定时器。它肯定不能理解,如果TimerTasks都应该在500毫秒的时间间隔内运行,所以不应该有一个新的线程,它足以在runnables上做一个循环并且一个接一个地执行它们。
- 确实的Java有此问题的内置解决方案或者是我可以使用设计模式或者我应该依赖于我的解决方案,在第一看起来这么脏?
那么NASA的任务控制应用程序是用'Swing'写成的?很高兴知道。 – vikingsteve