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