编辑:我已经参考了这个链接,我能够理解 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
):
为什么它的实现方式是InvocationTargetException
在 EDT 线程中调用时抛出一个?
第二个问题(使用时InvokeLater
):
为什么 InvokeLater 允许这样做?
嗯,这是我对 EDT 线程的基本理解:
调用并等待:
- 将作业 F 放入 EDT 事件队列并等待 EDT 执行它。
- 此调用阻塞,直到所有未决的 AWT 事件(A、B、C、D、E)都已处理并(然后)执行 F,之后控制返回。
- 当且仅当提交的作业完成时返回。(控制在 F 完成后返回。)
- 从技术上讲,是同步阻塞调用。
调用后:
- 将作业 F 放入 EDT Queue ,但不等待其完成。(基本上,发布和返回调用)。
- 如果我们不关心作业的完成,我们可以使用 InvokeLater。
- 从技术上讲,异步非阻塞调用。