gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:40:05 26 4
gpt4 key购买 nike

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

  1. 这是否意味着所有其余的 GUI 绘制/更新/等等。会在主线程中吗?
  2. invokeLater 之外调用 repaint 会使所有后续调用落入主线程吗?

基本上是这样的:

<小时/>
void main()
{
JFrame jmf();
setVisible(jmf);
}

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

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

注意:在小型 GUI 的情况下,如果我不放置 invokeLater 它似乎工作正常。事实上,尽管执行了 main 的最后一行,应用程序并没有终止。

我读过很多关于为什么我们应该使用它的文章,因为 Swing 不是线程安全的(它是单线程的等等),但我真的没有读到不安全的后果调用 invokeLater (部分原因是我对线程的了解有限)

最佳答案

现实是,什么都不会发生,或者世界将会终结。断言几乎是不可能的,这是多线程环境的本质......

除非您正在执行一些真正动态的设置,否则在 a 框架可见之前,“应该”可以不在 EDT 的上下文中执行此操作。

问题归结为不同平台的实现方式不同(在 native 级别)。例如,启动 UI 时使用 invokeLater 的最初要求似乎来自多年前 Sun 操作系统上的死锁。

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

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

根据 OP 的评论进行更新

repaintRepaintManager 发出请求,该请求决定应该绘制什么内容以及何时绘制某些内容。它实际上会将“绘制”事件直接发布到事件队列,然后由事件调度线程处理,因此重绘实际上是在(少数)线程安全方法上......

看看

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

关于java - 如果我不使用 SwingUtilities.invokeLater 怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com