研究案例: 我在 Swing 中有一个包含一些模型类和一些 GUI 类的程序,我在这两个类中都使用了几个线程,它们运行一个无限循环,每个可运行对象具有不同的睡眠间隔。两个模型线程运行一项非常关键的工作,如果延迟从 40 毫秒上升到 60 毫秒,将无法正常工作,因此它们非常关键。
但是我在 GUI 中有数百个组件必须在不到一秒或更频繁的时间内更新。这些组件无法使用观察者设计模式进行更新,因为它们不仅仅反映模型中的更改。他们应该计算诸如剩余时间之类的东西。
问题
- 我认为使用
Runnable
调用的数百个 sSwingUtilities.invokeLater(runnable)
来更新所有 GUI 组件效率不高。因为上下文切换会产生巨大的副作用。所以我要避免它。我真的应该避免创建所有这些可运行对象,invokeLater()
还是swing timer
不将它们作为线程运行并且即使其中所有这些都具有优化方法Thread.sleep(500)
? - 为了解决上述问题,我决定创建一个带有更新方法的接口 SwingUpdatable。并创建一个每 500 毫秒运行一次的 SingleTonSwingUpdater,并运行向其注册的类的所有更新方法。观察者设计模式让我想到了这个想法。但我担心这将是一种反模式。而且我不确定它是否会降低程序的灵活性。
- 如果我使用摇摆定时器怎么办。它肯定无法理解,如果 TimerTasks 都应该在 500 毫秒的时间间隔内运行,那么就不应该为它们创建一个新线程,并且在可运行对象上执行一个循环并一个接一个地执行它们就足够了。
- Java 是否有针对此问题的内置解决方案,或者是否有我可以使用的设计模式,或者我应该依赖最初看起来很脏的解决方案?