gpt4 book ai didi

java - 为什么要在 EDT 线程外调用 SwingUtils.invokeAndWait() 方法?

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:15 27 4
gpt4 key购买 nike

编辑:我已经提到了这个link并且我能够理解 InvokeLater 的代码流。我的问题是,为什么这个逻辑是这样实现的?有什么具体原因吗?


以下是我的代码:

  private void init() 
{
JFrame jfr = new JFrame();
jfr.setSize(500, 500);
jfr.setVisible(true);
jfr.setTitle("Test");


JButton jb = new JButton("Ok");
jfr.add(jb);

jb.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run()
{
System.out.println("hello");
}
});
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
});

第一个问题(使用InvokeAndWait时):

为什么它的实现方式是在 EDT 线程中调用时抛出 InvocationTargetException

第二个问题(使用InvokeLater时):

为什么 InvokeLater 允许这样做?

嗯,这是我对EDT线程的基本理解:

InvokeAndWait:

  • 将作业 F 放入 EDT 事件队列并等待直到 EDT执行了它。
  • 此调用会阻塞,直到所有待处理的 AWT 事件(A、B、C、D、E)都已完成被处理并(然后)执行 F 之后控制返回。
  • 当且仅当提交的作业完成时返回。(控制F完成后返回。)
  • 从技术上讲,同步阻塞调用。

InvokeLater:

  • 将作业 F 放入 EDT 队列,但不等待它完成。(基本上,发布和返回调用)。
  • 如果我们不关心作业的完成情况,我们可以使用 InvokeLater。
  • 技术上,异步非阻塞调用。

最佳答案

EDT 与 AWT 相同。 AWT 中的所有 UI 事件都安排在称为 EDT 的单个线程上。基本上就是Swing中用来处理UI相关事件的线程。

InvokeAndWait:基本上您在同一个线程上调用一个任务,然后等待该任务完成。这将导致死锁。您的方法永远不会返回,因为您正在等待任务,任务永远不会运行,因为您的方法永远不会完成。

InvokeLate:之所以有效,是因为您无需等待该任务完成。您在完全相同的线程中调用它,但不会等待它完成,因此这不会导致死锁。

关于java - 为什么要在 EDT 线程外调用 SwingUtils.invokeAndWait() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38305572/

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