首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要在EDT线程之外调用SwingUtils.invokeAndWait()方法?

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

Stack Overflow用户
提问于 2016-07-11 11:15:44
回答 1查看 1.3K关注 0票数 5

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

以下是我的代码:

代码语言:javascript
复制
  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。
  • 从技术上讲,是异步非阻塞呼叫。
EN

回答 1

Stack Overflow用户

发布于 2016-07-11 11:29:47

EDT与AWT相同。AWT中的所有UI事件都调度在一个名为EDT的线程上。基本上是用来在Swing中处理UI相关事件的线程。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38305572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档