编辑:我已经提到了这个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
InvokeLater
发布于 2016-07-11 11:29:47
EDT与AWT相同。AWT中的所有UI事件都调度在一个名为EDT的线程上。基本上是用来在Swing中处理UI相关事件的线程。
InvokeAndWait:基本上是在同一个线程上调用一个任务,然后等待该任务的完成。这将导致僵局。您的方法将永远不会返回,因为您正在等待任务,任务将永远不会运行,因为您的方法永远不会完成。
InvokeLate:工作是因为您没有等待该任务的完成。您在完全相同的线程中调用它,但是没有等待它完成,所以这不会导致死锁。
https://stackoverflow.com/questions/38305572
复制相似问题