Java 摆动螺纹安全

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

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

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

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

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

是的,invokeLater()是线程安全的。您不需要
myTextArea.repaint()
您通过
调用器将多个
可运行的
推送到EDT队列中,因此手动查询它们没有多大区别。除非您对更新进行批处理。从回调方法直接调用
append
是不安全的,对吗?@SimonZhu不,从回调方法调用append是不安全的method@ControlAltDel请说明
myTextArea.repaint()的原因