ここで単純なものが欠けていると確信していますが、それを見ることはできません。フラグを使用してスレッドを終了し、それを結合してきれいにクリーンアップしていますが、結合が終了せず、待機するだけです。現在、スレッドの実行ループには何もないため、別のループでスタックすることはありません。
スレッド:
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 スレッドを一時停止し、それが (running) 中にオンになっていることを確認しました。running は間違いなく false でした。次に、コードをステップオーバーすると、ループを終了して正しく終了しました。これは、デバッグが原因のようです。スレッドが何らかの理由で中断されているようです。