当 运行 在 VM 中时,Swing 遇到线程同步问题

Swing hits thread synchronization issues when run in a VM

我在 VM(管理程序是 kvm)中尝试 运行 一个来自 Gradle 的 swing 项目时遇到了一个奇怪的问题。

代码 运行 在主机 OS 的每次尝试中都很好,但大多数时候当 运行 来自来宾时,代码 运行 在 jframe.pack() 方法中挂起。我假设问题与线程同步有关。

与大多数 swing 应用程序一样,尝试 post 此处显示的代码是不现实的....但我可以在 GitHub

中指出它

我不会以任何其他方式使用线程,基本上只是让 swing 自行管理。我还为来宾提供了充足的资源,运行任何其他应用程序都没有任何问题。

我不太熟悉这里线程的细微差别,问题的根源是什么?我没有在创建自己的线程等方面做任何花哨的事情。我只是像 "normally" 一样设置我的 ui,并让 swing 处理它自己的线程。

主持人:

嘉宾:

如何设置 swing 应用程序的简单演练:

class Runner(){
    private Gui gui;

    public runGui(){ //what is run to run the gui
        gui = new Gui();
    }
}

// partially setup with Intellij's form builder
class Gui(){
    private JFrame mainFrame;
    //many other member variables and functions


    public void Gui(){
        //general setup of GUI code. generation of elements, event binding, etc
        this.mainFrame = new JFrame();
        ...

        // pack and open
        this.mainFrame.pack();
        this.mainFrame.setVisible(true);
    }

    {
        //intellij autogenerated form builder. Standard setup code.
        $$$setupUI$$$();
    }
}


I'm not terribly familiar with the nuances of the threading going on here, what could be the source of the issue?

是的。那可能是您问题的根源。 VM 中的线程时序可能与台式机中的不同。不过,如果你的代码写得正确,应该不会受此影响。

在没有更多信息(例如 minimal reproducible example)的情况下,我们最多只能为您指出一些关于一般线程的资源,以及在 Swing 应用程序中执行线程的正确方法:


硬件特性不太可能与问题相关。当然,它们不会影响您编写正确代码所需要做的事情。