【问题标题】:Swing thread safety摆动螺纹安全
【发布时间】:2016-02-20 15:45:01
【问题描述】:

假设我有一个多线程程序,它接收多个文件,每个线程从其中一个文件中读取行,并通过将每一行附加到 GUI 中的 TextArea 来更新 GUI 窗口。追加到 TextArea 的方法被注册为线程的回调方法。如何确保附加操作是线程安全的?我读过我应该使用java.awt.EventQueue.invokeLater; invokeLater 方法本身是线程安全的吗?也就是说,在回调函数中,我是否只需要创建一个 Runnable 来更新 TextArea 并在其上调用 invokeLater? (回调方法不同步)

【问题讨论】:

  • 是的,invokeLater() 是线程安全的。

标签: java multithreading swing


【解决方案1】:

读完每一行后,需要调用如下块:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    myTextArea.append(myLine);
    myTextArea.repaint();
  }
});

这可能会带来相当大的性能问题,因为您实际上是在 GUI 线程上同步所有文本行更新。为读取行使用线程安全(即同步)队列和从该队列读取并定期更新的 java.swing.Timer 可能更聪明

【讨论】:

  • 你不需要myTextArea.repaint()
  • 您通过 invokeLater 将多个 Runnables 推送到 EDT 队列中,因此与手动排队它们没有太大区别。除非您进行批量更新。
  • 在回调方法中直接调用append是不安全的吧?
  • @SimonZhu 不,从回调方法调用 append 是不安全的
  • @ControlAltDel 请问myTextArea.repaint();的原因是什么
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2013-06-28
  • 2011-04-01
相关资源
最近更新 更多