我刚刚学习Java课程,并且在我们进行多线程处理之前几周,在解释当两个(或更多)线程使用同一个对象时,必须从所有线程锁定对象,除了一个人正在使用它。
有一个GUI我想把一些数据从2个线程写入JTextArea
我应该在一个线程写入时锁定对象还是由JTextArea
处理?如果我应该为此烦恼,我怎么能这样做,因为我不能在Lock
类定义中声明JTextArea
?如果我不打扰这个,它是否与所有摆动对象保持一致,如果没有,有什么例外?
答案 0 :(得分:3)
在Swing中,您必须仅从UI线程更新GUI组件。因此,您必须从线程中安排这些更新,以便在UI线程上执行。
This is one example与SwingUtilities.invokeLater()
。
答案 1 :(得分:3)
在大多数情况下,Swing本质上不是线程安全的,所以你不能这样做 - 你必须通过结束SwingUtilities.invokeLater()
中的调用来更新EDT中的所有GUI组件。例如:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.setText("Blah");
}
});
虽然这个规则有几个选择组件在技术上有例外,但我仍然更喜欢在EDT上执行所有内容,除非有其他非常好的理由(非常非常罕见)。