当 运行 在 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 处理它自己的线程。
主持人:
- 分OS 8流
- 8 核/ 32g 内存
- Java 8
嘉宾:
- Ubuntu 19.10
- 已分配 8 核/16g 内存
- Java 8
如何设置 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 应用程序中执行线程的正确方法:
- https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
- https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
硬件特性不太可能与问题相关。当然,它们不会影响您编写正确代码所需要做的事情。
我在 VM(管理程序是 kvm)中尝试 运行 一个来自 Gradle 的 swing 项目时遇到了一个奇怪的问题。
代码 运行 在主机 OS 的每次尝试中都很好,但大多数时候当 运行 来自来宾时,代码 运行 在 jframe.pack()
方法中挂起。我假设问题与线程同步有关。
与大多数 swing 应用程序一样,尝试 post 此处显示的代码是不现实的....但我可以在 GitHub
中指出它我不会以任何其他方式使用线程,基本上只是让 swing 自行管理。我还为来宾提供了充足的资源,运行任何其他应用程序都没有任何问题。
我不太熟悉这里线程的细微差别,问题的根源是什么?我没有在创建自己的线程等方面做任何花哨的事情。我只是像 "normally" 一样设置我的 ui,并让 swing 处理它自己的线程。
主持人:
- 分OS 8流
- 8 核/ 32g 内存
- Java 8
嘉宾:
- Ubuntu 19.10
- 已分配 8 核/16g 内存
- Java 8
如何设置 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 应用程序中执行线程的正确方法:
- https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
- https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
硬件特性不太可能与问题相关。当然,它们不会影响您编写正确代码所需要做的事情。