java - SwingUtilities.invokeLater(runnable) 和 Swing Timer 如何工作?

标签 java multithreading swing timer invokelater

研究案例: 我有一个在 Swing 中包含一些模型类和一些 GUI 类的程序,其中我在两个类中使用多个线程,这些线程运行一个无限循环,每个可运行对象具有不同的 sleep 间隔。两个模型线程运行非常关键的工作,如果延迟从 40 毫秒上升到 60 毫秒,将无法正常工作,因此它们非常关键。

但是我在 GUI 中有数百个组件,必须在不到一秒或更频繁的时间内更新。这些组件无法使用观察者设计模式进行更新,因为它们不仅仅反射(reflect)模型中的更改。他们应该计算一些东西,例如剩余时间。

问题

  1. 我认为使用数百个 Runnable 效率不高 使用 SwingUtilities.invokeLater(runnable) 调用以更新所有 图形用户界面组件。因为上下文切换会产生巨大的影响 副作用。所以我要避免它。我真的应该避免吗 创建所有这些可运行对象或 invokeLater()swing timer 不会将它们作为线程运行,并且即使使用所有 Thread.sleep(500 )其中?
  2. 为了解决上述问题,我决定创建一个带有更新方法的 SwingUpdatable 接口(interface)。并创建一个运行 500 毫秒的 SingleTonSwingUpdater 并运行向其注册的类的所有更新方法。观察者设计模式让我思考这个想法。但我担心这将是一种反模式。而且我不确定这是否会降低程序的灵 active 。
  3. 如果我使用 swing 计时器会怎样。它肯定无法理解,如果所有 TimerTasks 都应该以 500ms 的时间间隔运行,那么就不应该为它们创建一个新线程,并且在可运行对象上进行循环并依次执行它们就足够了。
  4. Java 是否有针对此问题的内置解决方案,或者是否有我可以使用的设计模式,或者我应该依赖乍一看很脏的解决方案?

最佳答案

  1. SwingUtilities.invokeLater(runnable) 将 runnable 添加到队列中,然后 GUI 线程一次执行它们,因此上下文切换是最小的。避免在 GUI 线程上运行的作业中使用 Thread.sleep(),而是使用 Swing 计时器。

  2. 所提出的“解决方案”会增加数据可视化的延迟,并且没有任何好处。小心地为你不完全理解的问题添加解决方案。人类的直觉在计算机中发挥得很差。

  3. Swing 的计时器管理定时作业队列,并在延迟到期时将它们传递给 GUI 线程。这是非常有效的方法。

  4. 你在说什么问题?每秒数百个事件并不算多,标准方法应该可行。如果不这样做,则可能被滥用。

关于java - SwingUtilities.invokeLater(runnable) 和 Swing Timer 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20538371/

相关文章:

java - JTable所有列右对齐

java - ImageIcon 不显示在左上角的应用程序窗口中

java - Mockito 将模拟注入(inject) Spy 对象

java - 如何从特定偏移量到特定偏移量的kafka主题中使用数据?

java - 与 Statement 对象的 setFetchSize 方法混淆

python - 并行文件匹配,Python

java - 在线程进行额外处理之前和之后重新绘制玻璃板

java - ContextConfiguration 抛出 java.io.FileNotFoundException :

java - 灰度图像算法在多线程时比顺序慢

node.js - 带有 Redis 消息队列的 NodeJS - 如何设置多个消费者(线程)