好的,我确定我在这里遗漏了一些简单的东西,但看不到它。我正在使用一个标志来结束一个线程,然后加入它以整齐地清理,但连接永远不会完成它只是被卡住等待。当前线程的运行循环中没有任何内容,因此它不会卡在单独的循环中。
线:
package com.nox.willywars;
public class GameThread extends Thread {
//{{Variables
private boolean running;
//}}
//{{Getters/Setters
public void setRunning(boolean running) {
this.running = running;
}
//}}
//{{Constructor
public GameThread() {
running = false;
}
//}}Constructor
//{{Public methods
@Override
public void run() {
while(running) {
///...CODE GO HERE
}
}
public boolean isRunning() {
return running;
}
//}}
}
无法阻止它的代码:
//{{Lifecycle methods
@Override
public void create() {
//LOAD! Probably debug temp
TileFactory.load();
mapScreen = new MapScreen();
setScreen(mapScreen);
gameThread = new GameThread();
gameThread.setRunning(true);
gameThread.start();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
killGameThread();
}
private void killGameThread() {
if(gameThread != null) {
if(gameThread.isAlive() && gameThread.isRunning()) {
gameThread.setRunning(false);
boolean retry = true;
while(retry) {
try {
gameThread.interrupt();
gameThread.join();
retry = false;
} catch (InterruptedException e) {}
}
}
gameThread = null;
}
}
//}}
目前它到达 gameThread.join() 并卡在那里,等待线程完成。我在这里错过了什么吗?据我了解,一旦 running 设置为 false,线程应该完成,然后加入应该正常发生,因为它已经停止。
编辑:从运行 GameThread 的类中添加了更多代码。Pause() 是执行 KillGameThread 的地方。我已经让运行变得不稳定,但它没有任何效果。我还发现了另一个奇怪的症状:有人建议在 GameThread 卡住的时候查看里面的内容,所以我进入了调试器。当 join() 被卡住时,我暂停了 GameThread 线程并看到它在 while(running) 上运行,并且运行肯定是错误的。然后,当我跳过代码时,它退出了循环并正确完成,这似乎是由我的调试引起的。好像线程以某种方式挂起?