Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Swing中实现GUI,多线程是一个值得关注的问题_Java_Multithreading_Swing - Fatal编程技术网

Java 如何在Swing中实现GUI,多线程是一个值得关注的问题

Java 如何在Swing中实现GUI,多线程是一个值得关注的问题,java,multithreading,swing,Java,Multithreading,Swing,目标是一个GUI,在窗口中,按下play按钮将释放GUI资源并开始运行我的游戏(游戏在Swing之外完成,使用LWJGL) 这是我第一次看到自己这样做。在我看来,更安全的选择如下所示: public static void main(String[] args) { // setup gui objects JFrame frame = ...; frame.setVisible(true); // wait for the play button to

目标是一个GUI,在窗口中,按下play按钮将释放GUI资源并开始运行我的游戏(游戏在Swing之外完成,使用LWJGL)

这是我第一次看到自己这样做。在我看来,更安全的选择如下所示:

public static void main(String[] args) {
     // setup gui objects
     JFrame frame = ...;
     frame.setVisible(true);
     // wait for the play button to be pressed
     synchronized(frame) { 
         frame.wait(); 
     }
     // free the gui objects, start the game
     frame.dispose();
     startGame();
}
// by the way, this method is called from the button's action listener
public void onPlayButtonPress(JFrame parent) {
    // end the UI   
    synchronized(parent) {     
       parent.notify();
    }
}
对我来说,这看起来“安全”的原因是GUI和游戏执行的清理是在主线程内完成的。这是我看到自己这样做的第二种方式,但我不确定自己对此有何感受:

public static void main(String[] args) {
     // setup gui objects
     JFrame frame = ...;
     frame.setVisible(true);
}
public void onPlayButtonPress(JFrame parent) {
    // free the gui objects
    parent.dispose();
    startGameInNewThread();
}
第二种方法似乎更可取,因为它更简单,但我担心会出现一些问题。例如:

  • 在事件分派线程中处理帧会把事情搞砸吗
  • 在主线程已终止时启动游戏的新线程

所以我问这个问题的原因是因为我在寻找最好的方法来实现它,但我也有点好奇,如果我用第二种方法实现我的程序,是否会发生一些奇怪的事情,为什么会发生这些事情。

你可以简单地隐藏它,而不是处理框架。如果这不是一个选项,您可以先启动游戏线程(这样就有一个非守护进程线程在运行),然后处理框架。我个人更喜欢第二种选择