当我启动GUI界面时,如果我不使用invokeLater会发生什么?
repaint
之外调用invokeLater
会使所有后续调用都进入主线程吗?基本上这个:
void main()
{
JFrame jmf();
setVisible(jmf);
}
void main()
{
SwingUtilities.invokeLater(new Runnable(){
run(){
JFrame jmf();
setVisible(jmf);
}
}
});
注意:在GUI较小的情况下,如果我不放invokeLater
它似乎工作正常。实际上,虽然执行了main
的最后一行,但应用程序并未终止。
我已经阅读了很多文章,说明为什么我们应该使用它与Swing不是线程安全的事实(它是单线程等等),但我真的没有看到不是的影响调用invokeLater
(部分是因为我对线程知识有限)
答案 0 :(得分:4)
现实是,没有任何事情可能发生,或者世界将会结束。它几乎不可能断言,这是多线程环境的本质......
除非你正在进行一些非常动态的设置,否则直到一帧被显示为止,“应该”可以不在EDT的上下文中进行。
问题归结为不同平台的实现方式不同(在本机级别)。例如,在启动UI时使用invokeLater的原始要求似乎来自多年前Sun OS上的死锁。
我也看到了Java 7的一些问题(但是我的前辈对线程的想法至少可以说是奇怪的)。一般的建议是,使用invokeLater来创建和显示您的UI。在EDT上下文中运行所有UI代码
它还可以降低您花费数周时间尝试复制并追踪那些奇怪异常的风险(通过在EDT中运行所有UI代码)
根据OP的评论更新
repaint
向RepaintManager
发出请求,该请求决定应该绘制什么内容以及什么时候绘制内容。它实际上会将“paint”事件直接发送到Event Queue,然后由Event Dispatching Thread处理,因此重绘实际上是(少数)线程安全方法...
看看
一般的建议是,你应该使用invokeLater
,因为这就是API的设计方式,做其他任何事情都会引发问题......