认识到被阻止的摇摆EDT

时间:2015-06-17 02:18:04

标签: java multithreading swing

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

我正在前往毕业的最后一个大学任务的路上有很多图表,但对Swing EDT(Java一般)知之甚少。

看看这篇文章:

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

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

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

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

提前致谢

1 个答案:

答案 0 :(得分: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何时被阻止:这很棘手,但是分析器或线程转储可以帮助分析同步问题。