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,这样才能可靠地工作。谢谢!我将它设置为守护进程。我希望它在播放器退出窗口时关闭。