Java Swing对JTextArea的多线程访问

Luo*_*Luo 7 java swing multithreading jtextarea

我有一个多线程Java Swing应用程序.

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

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        textArea.append("something");
    }
});
Run Code Online (Sandbox Code Playgroud)

或者它只是一个内容更新,Swing会自己做正确的线程吗?

Tim*_*m B 1

一般来说,您对 Swing 所做的任何更新,特别是任何更改控件状态或布局的操作,都应该从 Swing 线程完成。

在这种情况下,您是绝对正确的,将每个更新包装到一个中invokeLater是执行此操作的正确方法。您可以尝试更新自己的队列或类似的队列,但是当 Swing 已经提供了您需要的功能时,那么使用它就有意义了。

请参阅JTextArea文档: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html

哪里说的

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

其中说:

一般来说,Swing 不是线程安全的。除非另有说明,所有 Swing 组件和相关类都必须在事件分派线程上访问。

JTextArea#append方法中没有任何记录表明可以安全地从其他线程使用该方法。