Java Swing对JTextArea的多线程访问

Java Swing对JTextArea的多线程访问,java,multithreading,swing,jtextarea,Java,Multithreading,Swing,Jtextarea,我有一个多线程的JavaSwing应用程序 几个线程将通过textArea.append(“something”)通过写入JTextArea调用该方法。我应该这样包装它: SwingUtilities.invokeLater(new Runnable() { @Override public void run() { textArea.append("something"); } }); 或者它只是一个内容更新,Swing本身会执行正确的线程处理?一般来

我有一个多线程的JavaSwing应用程序

几个线程将通过
textArea.append(“something”)
通过写入
JTextArea
调用该方法。我应该这样包装它:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        textArea.append("something");
    }
});

或者它只是一个内容更新,Swing本身会执行正确的线程处理?

一般来说,您对Swing所做的任何更新,尤其是更改控件状态或布局的任何更新,都应该从Swing线程执行

在本例中,您完全正确,将每个更新包装到
调用器中是正确的方法。您可以尝试更新自己的队列或类似的队列,但是当Swing已经提供了您所需要的功能时,使用它是有意义的

请参阅
JTextArea
文档:

上面写着

警告:Swing不是线程安全的。有关更多信息,请参阅Swing的线程策略

上面写着:

通常,Swing不是线程安全的。除非另有说明,否则必须在事件调度线程上访问所有Swing组件和相关类


JTextArea#append
方法中没有任何文档说明从其他线程使用它是安全的。

JTextArea#append(…)
的调用应该排队到Swing事件线程中,以便最安全、最好地工作。您的方法是一个好的开始。问题是,您是否关心更新的顺序?如果你这样做了,那么你的手上就有一个大问题;)实际上不是。我有一个相反的问题-你是指swing显示的顺序还是方法调用的顺序?该方法有一个计数器,它标记消息(日志)。但你的意思是Swing会以错误的顺序显示数字消息吗?那么,我应该使用这样的wrap吗?正如前面所说的,您肯定应该使用这个“wrap”,因为UI小部件方法决不能从事件调度线程以外的任何其他线程调用。