gpt4 book ai didi

java - 识别挥杆受阻 EDT

转载 作者:行者123 更新时间:2023-12-01 11:25:01 28 4
gpt4 key购买 nike

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

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

看看这篇文章:

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

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

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

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

提前致谢

最佳答案

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

关于java - 识别挥杆受阻 EDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com