两个线程写入相同的JTextArea

时间:2013-12-08 21:12:46

标签: java multithreading swing jtextarea

我刚刚学习Java课程,并且在我们进行多线程处理之前几周,在解释当两个(或更多)线程使用同一个对象时,必须从所有线程锁定对象,除了一个人正在使用它。

有一个GUI我想把一些数据从2个线程写入JTextArea我应该在一个线程写入时锁定对象还是由JTextArea处理?如果我应该为此烦恼,我怎么能这样做,因为我不能在Lock类定义中声明JTextArea?如果我不打扰这个,它是否与所有摆动对象保持一致,如果没有,有什么例外?

2 个答案:

答案 0 :(得分:3)

在Swing中,您必须仅从UI线程更新GUI组件。因此,您必须从线程中安排这些更新,以便在UI线程上执行。

This is one exampleSwingUtilities.invokeLater()

答案 1 :(得分:3)

在大多数情况下,Swing本质上不是线程安全的,所以你不能这样做 - 你必须通过结束SwingUtilities.invokeLater()中的调用来更新EDT中的所有GUI组件。例如:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        textArea.setText("Blah");
    }
});

虽然这个规则有几个选择组件在技术上有例外,但我仍然更喜欢在EDT上执行所有内容,除非有其他非常好的理由(非常非常罕见)。