Java 游戏线程不会停止

Java 游戏线程不会停止,java,multithreading,Java,Multithreading,我已经尝试了很多方法来解决这个问题,但我似乎永远都不知道什么可以解决这个问题。 当我停止游戏时,我的游戏线程不会停止运行 主类 public class Game extends JFrame implements Runnable { private static final long serialVersionUID = 4662621901369762109L; public static final Rectangle windowSize = new Rectangle

我已经尝试了很多方法来解决这个问题,但我似乎永远都不知道什么可以解决这个问题。 当我停止游戏时,我的游戏线程不会停止运行

主类

public class Game extends JFrame implements Runnable {
    private static final long serialVersionUID = 4662621901369762109L;
    public static final Rectangle windowSize = new Rectangle(800, 600);
    public static final int fps = 60;
    private static Game instance;
    private static Thread gameThread;
    public static final PaintCanvas canvas = new PaintCanvas();

    public Game() {
        this.setSize(windowSize.getWidth(), windowSize.getHeight());
        this.setTitle("Test");
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.add(canvas);

        Spawner mainSpawner = new Spawner();
        mainSpawner.setPosition(new Point(windowSize.getWidth() / 2 - 30, windowSize.getHeight() / 2 - 30));
    }

    public static void main(String[] args) {
        instance = new Game();
        gameThread = new Thread(instance);
        gameThread.start();
    }

    public void run() {
        while (true) {
            update();
            try {
                // 1000 divided by fps (for 60 fps, it is 16.666 repeating)
                Thread.sleep(1000 / fps);
            }
            catch (InterruptedException e) {
                break;
            }
        }
    }

    private static void update() {
        for (GameObject g : new ArrayList<GameObject>(GameObjectManager.getGameObjects())) {
            g.update();
        }
        canvas.repaint();
    }

    public static Game getInstance() {
        return instance;
    }
}
我真的不擅长线程,所以请帮助

两件事:

是什么让你相信关闭主线程会中断游戏线程?你从不在任何地方调用中断,所以我不知道为什么你希望在主线程结束时发生InterruptedException。这种情况不会发生。 非守护进程线程将继续运行;如果仍然存在非守护进程线程,JVM将不会关闭。如果这不是你想要的行为。 您可能想考虑使用计时器或StjeExtEutoService来更新,而不是创建一个新线程,因为它通常更易于管理。 终止线程最基本的方式是:

volatile boolean stopMyThread = false;

public void run() {
    while (!stopMyThread) {
    }
}
然后,当您想要停止时:

stopMyThread = true;
并可选地在线程上加入以等待其停止


但是,使用a或者更好的是a,您可以稍微简化代码。

您似乎还有一个无限循环,而只有在发生中断异常时才会出现该循环-如果没有发生,则为无限循环。GUI代码与此无关,您甚至没有尝试停止。创建一个用于while循环的布尔值,并在需要停止时将其设置为false。或者,您可以从另一个线程中断线程。我希望它在玩家退出游戏时停止。我尝试将while循环更改为while游戏线程!=空值,但它仍然不起作用。@MCMastery为什么希望更改使它起作用?没有任何东西会将gameThread设置为null,这样就永远不会发生这种情况,即使发生了这种情况,您也需要将gameThread声明为volatile,这样才能可靠地工作。谢谢!我将它设置为守护进程。我希望它在播放器退出窗口时关闭。