如果我不使用SwingUtilities.invokeLater怎么办?

时间:2013-11-29 23:35:14

标签: java multithreading swing invokelater

当我启动GUI界面时,如果我不使用invokeLater会发生什么?

  1. 这是否意味着所有其他GUI绘制/更新/等。将在主线程?
  2. repaint之外调用invokeLater会使所有后续调用都进入主线程吗?
  3. 基本上这个:


    void main()
    {
        JFrame jmf();
        setVisible(jmf);
    }
    

    ------------- VS -------------

    void main()
    {
        SwingUtilities.invokeLater(new Runnable(){
           run(){
              JFrame jmf();
              setVisible(jmf);
           }
        }
    });
    

    注意:在GUI较小的情况下,如果我不放invokeLater它似乎工作正常。实际上,虽然执行了main的最后一行,但应用程序并未终止。

    我已经阅读了很多文章,说明为什么我们应该使用它与Swing不是线程安全的事实(它是单线程等等),但我真的没有看到不是的影响调用invokeLater(部分是因为我对线程知识有限)

1 个答案:

答案 0 :(得分:4)

现实是,没有任何事情可能发生,或者世界将会结束。它几乎不可能断言,这是多线程环境的本质......

除非你正在进行一些非常动态的设置,否则直到一帧被显示为止,“应该”可以不在EDT的上下文中进行。

问题归结为不同平台的实现方式不同(在本机级别)。例如,在启动UI时使用invokeLater的原始要求似乎来自多年前Sun OS上的死锁。

我也看到了Java 7的一些问题(但是我的前辈对线程的想法至少可以说是奇怪的)。一般的建议是,使用invokeLater来创建和显示您的UI。在EDT上下文中运行所有UI代码

它还可以降低您花费数周时间尝试复制并追踪那些奇怪异常的风险(通过在EDT中运行所有UI代码)

根据OP的评论更新

repaintRepaintManager发出请求,该请求决定应该绘制什么内容以及什么时候绘制内容。它实际上会将“paint”事件直接发送到Event Queue,然后由Event Dispatching Thread处理,因此重绘实际上是(少数)线程安全方法...

看看

一般的建议是,你应该使用invokeLater,因为这就是API的设计方式,做其他任何事情都会引发问题......