gpt4 book ai didi

java - Thread.join() 之后无法执行任何操作

转载 作者:行者123 更新时间:2023-12-01 10:06:51 24 4
gpt4 key购买 nike

我一直在制作马里奥游戏并取得了良好的进展。现在我需要在两个世界之间切换。首先,我停止运行更新和绘制方法的线程,然后删除世界中的所有内容(玩家、敌人、草地等),然后加载一个新世界。然后我尝试再次启动线程。但由于某种原因,停止线程后,此后不会执行任何操作,它只是“卡住”在那里。

private synchronized void clearWorld() {
stop();
System.out.println("Stopped");
for(int a = 0 ; a < handler.wall.size() ; a++) handler.wall.remove(handler.wall.get(a));
for(int b = 0 ; b < handler.creature.size() ; b++) handler.creature.remove(handler.creature.get(b));
System.out.println("Everything removed");
}

private synchronized void switchWorld(String path) {
world = new World(this , path);
start();
System.out.println("Thread started");
}
public synchronized void stop() {
if(!running) return ;
running = false ;
try {
Main.getGame().thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void start() {
if(running) return ;
running = true ;
Main.game.thread.start();
}

public void run() {
init();
long lastTime = System.nanoTime();
final double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
int updates = 0;
int frames = 0;
long timer = System.currentTimeMillis();

while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >= 1){
tick();
updates++;
delta--;
}
render();
frames++;

if(System.currentTimeMillis() - timer > 1000){
if(world.Goombas==getPlayer().gKilled ) {
clearWorld();
switchWorld("/pipe_world1.txt");
}
timer += 1000;
System.out.println(updates + " Ticks, Fps " + frames);
updates = 0;
frames = 0;
}

}
}

最佳答案

Thread.join 挂起调用线程并等待目标线程死亡。您的代码中发生的情况是调用 clearWorld 的线程正在等待游戏线程终止。

编辑:更新后,我发现是游戏线程本身正在调用join。这肯定会导致对 join 的调用永远阻塞。请参阅Thread join on itself以获得解释。

由于您在一个线程中完成所有操作,因此根本不需要 joinstart

如果您确实有多个线程,那么更好的方法是在游戏线程中添加一个变量来检查游戏执行是否暂停。也许是这样的:

class GameThread extends Thread {
private volatile boolean paused;

public void run() {
while (true) {
if (!paused) {
executeGameLogic();
} else {
// Put something in here so you're not in a tight loop
// Thread.sleep(1000) would work, but in reality you want
// to use wait and notify to make this efficient
}
}
}

public void pause() {
paused = true;
}

public void unpause() {
paused = false;
}
}

然后,您的 clearWorldswitchWorld 方法可以在游戏线程上调用 pauseunpause

关于java - Thread.join() 之后无法执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36382656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com