小编典典

识别摆动EDT

java

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

我正要去完成大学的最后一项毕业任务,该任务有很多图表,但是对Swing EDT(一般来说是Java)了解很少。

看一下这块:

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

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

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

在我问这个问题之前,我已经阅读了一些文档(但是失败之后,我无法通过简单的解释向我说明如何防止阻塞EDT。)

提前致谢


阅读 211

收藏
2020-11-30

共1个答案

小编典典

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

这是一个示例,在按下“
Click&Wait”按钮之后,将阻止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:这很棘手,但是探查器或线程转储可以帮助分析同步问题。

2020-11-30