java - 如何将对象从主线程传递到java中的另一个线程

标签 java multithreading nullpointerexception

在我的主应用程序类中,我有一个 JTextArea 对象(比如 txtArea)。我在 main_application 程序中创建了另外两个线程。我创建的两个线程用于串口读写。现在我想把串口读缓冲区数据放到一个JTextArea对象中。所以我需要将在 main_application 中创建的 JTextArea 对象传递给 read-thread,以便 read-thread 可以将读取的输出放入 JTextArea。

但是在这样做之后我面临空指针访问问题。当我检查 main_application 中的 JTextArea 对象时,它不为空,但在传递给线程后,我检查了它的空值。我不知道它是怎么发生的....如果有任何极客可以帮助我我会很高兴....

谢谢, 苏尔佳

最佳答案

如另一个响应中所述,您只能在 swing 线程本身上更改 Swing 组件的内容。确保所有其他线程执行此操作的一个好方法是不公开实际的 JTextArea,而是为其他对象提供一种安全方法,以从您的 main_application 向文本区域添加文本,如下所示:

公共(public)类 main_application {

private JTextArea txtArea;

public void addText(final String txt) {
    SwingUtilities.invokeLater(new Runnable() {
        公共(public)无效运行(){
            txtArea.setText(txtArea.getText() + txt);
        }
    });
}

}

这是一个简单的示例,但您可以根据需要对此进行扩展。这也使用了一种成本更高的添加到文本的方式,因为它附加了两个不可变的字符串。您可以使用 JTextArea.getDocument() 来检索模型,然后使用文档中的变异方法更有效地更新文本。但是,通过提供这样的方法,您可以在将来更改实现,而不会影响您的其他线程或对象。

注意参数txt 是final 是必需的,这样在匿名内部类中可以直接引用它。

您可能希望将其与您的主应用程序类分离,并为您想要从其他线程操作文本区域的方法/方式创建一个接口(interface)或类,然后将它们传递给一个包装的对象这个文本区域。

关于java - 如何将对象从主线程传递到java中的另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794483/

相关文章:

iOS 客户端尝试将所有字段设置为 null 的对象插入到本地主机上的端点

java - 参数 'sourceEncoding' rpm-maven-plugin 丢失或无效

java - 二维对象数组的 NullPointerException

java - java生产者消费者模式如何出现死锁和饥饿问题?

python - PYQT - 如何使用取消按钮取消 GUI 中的循环?

multithreading - 如何使用人造丝进行枚举迭代?

java - 如何解决竞争条件

android - Textview.settext() 给出空指针异常

java - 什么是NullPointerException,我该如何解决?

Java - 处理数据类型不匹配并继续程序