【问题标题】:Recognizing Blocked Swing EDT识别受阻挥杆 EDT
【发布时间】:2015-09-02 01:54:09
【问题描述】:

如何知道EDT 被阻塞(不是通过视觉而是通过检查线程本身)?有什么办法吗?

我正在完成我最后的大学毕业任务,其中有一堆图表,但对 Swing EDT(通常是 Java)知之甚少。

看看这篇文章:

 SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             //  task here
         }
    });

如果我们在块上做一些修改gui组件的任务(包括调用另一个线程),那已经是正确的方法了吗?

而且由于 EDT 是单线程环境,还有什么(至少)一个部分/示例阻塞 EDT 除了直接在 GUI 内调用Thread.start()。我应该调用什么方法来识别EDT 被阻止

在我问这个问题之前,我已经阅读了一些文档(但它未能以简单的解释向我解释如何防止阻塞 EDT。)

提前致谢

【问题讨论】:

  • AFKAI 没有真正的方法可以知道 EDT 何时被阻止。您可以使用 SwingUtilities.isEventDispatchThread() 来检测您何时在 EDT 中执行,并且应该使用 SwingWorker、Swing TimerThreads 在 EDT 之外执行长时间运行的任务。 invokeLater 将在 EDT 的上下文中执行 Runnable
  • @MadProgrammer 感谢您的回复,如果是的话,是否有任何示例表明我们阻止了 EDT(谷歌只是混淆了一些预先文件。)
  • Thread.sleep(1000) 在 EDT 的上下文中调用将阻止它运行 1 秒。
  • @MadProgrammer,嗯,我明白了,你能在回答中解释更多吗,我知道这个评论框非常有限。
  • 我还是不确定你在问什么

标签: java multithreading swing


【解决方案1】:

除了被Thread.sleep() 阻止之外,EDT 还可以例如在等待异步操作时被阻塞。

这是一个例子——在按下“点击并等待”按钮之后——阻塞 EDT,直到主线程可以从控制台读取文本。您会注意到按钮一直按下,直到输入文本。然后 EDT 恢复并更新标签:

CompletableFuture<String> future = new CompletableFuture<>();

SwingUtilities.invokeLater(() -> {
    JFrame f = new JFrame("EDT Blocking Example");
    f.setSize(200, 200);
    JLabel label = new JLabel();
    JButton button = new JButton("Click & Wait");
    button.addActionListener(l -> {
        try {
            // calling get() will block the EDT here...
            String text = future.get();
            label.setText(text);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
    JPanel content = new JPanel();
    content.add(button);
    content.add(label);
    f.setContentPane(content);
    f.setVisible(true);
});
System.out.print("Enter some text: ");
String input = new Scanner(System.in).nextLine();

future.complete(input);

至于知道 EDT 何时被阻塞:这很棘手,但分析器或线程转储可以帮助分析同步问题。

【讨论】:

  • 这至少对我来说是完美的答案,简单明了,谢谢兄弟!
  • 很高兴它有帮助——虽然我是一个姐妹 ;-)
  • 哦,对不起,谢谢小姐。!感谢垃圾神提供来源
猜你喜欢
  • 2011-01-21
  • 2015-05-17
  • 2012-02-08
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多