2013-12-08 84 views
1

我刚刚通过Java课程,并在我们通过多线程前几周解释当两个(或更多)线程使用同一个对象时,对象必须是锁定在除了使用它的那个线程外的所有线程上。两条线程写入相同的JTextArea

拥有一个GUI我想从2个线程写入一些数据到一个JTextArea我应该在一个线程写入时锁定对象还是已经由JTextArea处理?如果我应该打扰一下,我该如何去做,因为我不能在JTextArea类定义中声明Lock?如果我不打扰这件事,它是否与所有的摇摆物体保持一致,如果不是,有什么例外?

+0

[检查此答案](http://stackoverflow.com/questions/2899682/unresponsive-threading-involving-swing-and-awt-eventqueue/20359861#20359861)在那里我把关于GUI渲染的讨论任务使用'SwingUtilites'将GUI渲染任务提交给在Event(事件分派线程)中执行的'EventQueue'。如果在文本出现之前需要关系时发生,则可以将此调用代码放入同步函数中,但必须按照描述进行度量。 – Sage

回答

3

Swing本质上不是线程安全的,因此您无法做到这一点 - 您必须通过在SwingUtilities.invokeLater()中完成呼叫来更新来自EDT的所有GUI组件。例如:

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

虽然有技术上的例外有几个选择组件,我仍是目前更愿意在美国东部时间执行一切,除非有一个很好的理由,否则(非常非常罕见的案例)。

+0

你能解释一下怎么样和\或为什么包装做的伎俩?我看不出如何将这与我以前的多线程知识相匹配。 –

+0

包装是否与'.setText'方法相关,也就是说,如果在我的情况下'run()'调用另一个实际上写入的方法,我仍然应该包装'run()'或涉及实际写入目的? –

+3

这个包装不会立即执行你在当前线程的'run()'方法中放置的任何东西,而是在事件派发线程上执行队列(一个线程专用于执行与GUI组件相关的所有方法)。 “当前线程,现在就做这个”你在说“嘿,安全地执行GUI内容的线程,当你下一次可以自由地执行某些操作时调用这个方法” – berry120

3

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

This is one exampleSwingUtilities.invokeLater()

相关问题