Java Swing多线程访问JTextArea

7

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

几个线程将通过 textArea.append("something") 写入到 JTextArea 的方法中。我应该这样包装它吗:

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

还是只更新内容,Swing会自己处理正确的线程吗?

3
调用JTextArea#append(...)应该加入到Swing事件线程中,以确保最安全、最好的效果。 - Hovercraft Full Of Eels
1
你的方法是一个不错的开始。问题是,你在意更新的顺序吗?如果在意,那么你手头上有一个大问题 ;) - MadProgrammer
1
例如:(https://dev59.com/kHA75IYBdhLWcg3wg5js#3245805)。 - trashgod
@Luo 如前所述,您应该绝对使用此“wrap”作为UI小部件方法绝不能从事件分派线程以外的任何其他线程调用。 - isnot2bad
这个问题还包括一个带有完整源代码的答案。那么问题在哪里呢? - Audrius Meškauskas
显示剩余2条评论
1个回答

1
一般来说,对于Swing的任何更新,特别是任何更改控件状态或布局的操作,都应该从Swing线程中完成。在这种情况下,您是完全正确的,将每个更新包装到invokeLater中是正确的方法。您可以尝试更新自己的队列或类似内容,但是当Swing已经提供了所需的功能时,使用它是有意义的。请参阅JTextArea文档:http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html其中写道:“警告:Swing不是线程安全的。有关详细信息,请参见Swing的线程策略。”还写道:“通常情况下,Swing不是线程安全的。所有Swing组件和相关类(除非另有说明),必须在事件分派线程上访问。”JTextArea#append方法没有任何文档说明可以从其他线程中安全使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接