首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别阻塞摆动EDT

识别阻塞摆动EDT
EN

Stack Overflow用户
提问于 2015-06-17 02:18:04
回答 1查看 899关注 0票数 0

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

我正在准备毕业的最后一项大学任务,这些任务有很多图表,但对Swing EDT (Java一般)知之甚少。

看看这件作品:

代码语言:javascript
复制
 SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             //  task here
         }
    });

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

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

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

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-17 03:47:33

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

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

代码语言:javascript
复制
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何时被阻塞,这是很棘手的,但是分析器或线程转储可以帮助分析同步问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30881263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档