java - JTextArea线程安全吗?

标签 java multithreading swing user-interface jtextarea

我有一些代码执行一些初始化(包括创建一个 JTextArea 对象),启动三个单独的线程,然后这些线程尝试更新 JTextArea (即 append() 到它),但它根本不起作用。 JTextArea 上没有显示任何内容(但是,在初始化期间,我在其上打印了一些测试行,效果很好)。这是怎么回事?我怎样才能解决这个问题?此外,每个线程每次必须更新 JTextArea 时都会 hibernate 一段随机时间。

抱歉,我没有提供任何代码,它全部分布在多个文件中。

最佳答案

虽然我相信 API 已经声明 JTextArea#append(...) 是线程安全的,但我听说过它存在问题,并且建议仅在 EDT 上调用它。典型的示例是使用 SwingWorker 并通过调用publish 附加到 process 方法中的 JTextArea。

对我来说,即使没有代码,也很难向您提出任何具体建议。我确实想知道您是否将 EDT 置于代码中的某个位置。

编辑:根据您的评论查看本教程:Concurrency in Swing

<小时/>

编辑2:根据Tim Perry的评论,线程安全性的损失及其背后的原因已发布在 this Java bug这与将文本添加到 JTextArea 文档中的这行代码有关:

doc.insertString(doc.getLength(), str, null);

该行分解为两行:

  1. int len=doc.getLength();
  2. doc.insertString(len,str,null);

问题在于,如果文档 doc 在第 1 行和第 2 行之间发生更改,尤其是文档长度,则可能会出现问题。

关于java - JTextArea线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869027/

相关文章:

java - 调用绘制后 JPanel 不显示在 JFrame 中

java - 返回字符串的函数的 C++ 执行顺序

java - 我对 Java 多线程感到困惑

ios - RxSwift 和 CLLocation : crash when trying to get user location

Java程序无限循环,没有任何错误信息

java - 多类图形用户界面

java - 在 Java 中使用 apache poi 使​​用填充和线条格式化图片

java - 如何在 Intellij IDE(特别是 Android Studio)中创建并运行具有依赖项的可执行 jar?

java - 使用正则表达式查找 zip 文件中的文件

Java swing,无法使图像工作