【问题标题】:Two threads writing to the same JTextArea两个线程写入同一个 JTextArea
【发布时间】:2013-12-25 21:15:09
【问题描述】:

我刚刚学习 Java 课程,几周前我们学习了多线程,其中解释说,当两个(或更多)线程处理同一个对象时,必须从所有线程锁定对象,除了一个与它一起工作的人。

有一个 GUI 我想将一些数据从 2 个线程写入 JTextArea 是否应该在一个线程写入对象时锁定对象,或者这已经由 JTextArea 处理?如果我应该为此烦恼,因为我不能在JTextArea 类定义中声明Lock,我该怎么做?如果我不应该为此烦恼,它是否与所有摆动对象保持相同,如果不是,有哪些例外?

【问题讨论】:

  • check this answer 在这里我讨论了使用SwingUtilites 将GUI 渲染任务提交给EventQueue 以在EDT(事件调度线程)中执行的GUI 渲染任务。如果发生在文本出现需要关系之前,您可以将此调用代码放在同步函数中,但必须按照描述采取措施。

标签: java multithreading swing jtextarea


【解决方案1】:

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

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

尽管这个规则在技术上存在一些例外情况,但有一些选择的组件,但我仍然更喜欢在 EDT 上执行所有操作,除非有很好的理由(非常非常少见)。

【讨论】:

  • 您能否解释一下如何和\或为什么包装会起作用?我看不出如何将其与我以前的多线程知识相匹配。
  • 包装器是否与.setText 方法有关,即如果在我的情况下run() 调用另一个实际执行写入的方法,我应该仍然包装run() 或涉及实际写入的方法到对象?
  • 这种包装不会立即执行您在当前线程上的run() 方法中放置的任何内容,它会在事件调度线程(一个专用于执行与GUI 组件相关的所有方法的线程)上排队执行.) 而不是说“当前线程,现在执行此操作”,而是说“嘿,安全执行 GUI 内容的线程,当您下次有空做某事时调用此方法”
【解决方案2】:

在 Swing 中,您只能从 UI 线程更新 GUI 组件。因此,您必须将线程中的这些更新安排在 UI 线程上执行。

This is one exampleSwingUtilities.invokeLater()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2018-11-24
    相关资源
    最近更新 更多