代码之家  ›  专栏  ›  技术社区  ›  Cratylus

swing中EDT的更新是绝对规则还是有例外?

  •  1
  • Cratylus  · 技术社区  · 14 年前

    在Swing中,GUI应该只由EDT更新,因为GUI组件不是线程安全的。

    JTable 线程从网络接收信息并更新表(不使用 EventQueue.invokeLater ). 所有其他组件都从EDT更新。到目前为止,我还没有看到任何问题,我想知道一个bug是否最终会出现。

    我的目的是实时更新表。数据不断地来自网络,为此,我专门为表使用了一个线程,以便在数据到来时不断更新。如果我使用SwingUtilities.invokeLater调用器,这意味着该表将在EDT可用时更新。swing不应该用于实时更新需求吗?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Tom Hawtin - tackline    14 年前

    有一些方法被记录为线程安全的。我相信JDK7中少了一些,因为事实证明它们中的一些是不可实现的线程安全的。在大多数情况下,Swing是线程敌对的-它必须从AWT-EDT线程使用。这主要是因为它使用 EventQueue.invokeLater 内部“随机”。此外,还有隐藏的共享状态(例如,您可以更改PL&F而不必告诉每个组件)。有些类可以作为线程不可知的类来处理,但是它们没有这样的文档记录。

        2
  •  6
  •   Richard Fearn    14 年前

    我不再试图推理它是否会工作,而是坚持众所周知的“规则”,即您应该只使用事件调度线程与GUI组件交互。当您从网络接收数据时,只需使用 SwingUtilities.invokeLater (或 invokeAndWait

    你可能不会马上看到问题,但很有可能你将来会看到。

        3
  •  2
  •   Kevin Day    14 年前

    您必须更新EDT上的GUI组件。句号。(这个规则有几个遗留的例外——但他们都默默地把事情交给了EDT)。EDT就像一个消息泵(就像大多数窗口系统一样)-如果你想更新GUI组件,你必须生活在这个限制之内。

    如果您想让您的表快速更新,请保持EDT的清洁-不要将任何巨大的负载放在它上面。

        4
  •  1
  •   trashgod    14 年前

    Swing不应该用于实时更新需求吗?

    Sun Java Real-Time System .

    here .

        5
  •  1
  •   Ricky Clarkson    14 年前

    这是一个绝对的规则,除非你想要比赛条件。事件调度线程足够快,我们的CCTV应用程序的显示不需要黑客。