Thread.join执行永远不会结束

时间:2015-04-19 14:47:35

标签: android multithreading surfaceview

所以我有这个游戏循环:

    public void run() {
    long sleepTime;
    while (state == RUNNING) {
        long beforeTime = System.nanoTime();
        //This is where we update the game engine
        gameEngine.processGameTick();


        Canvas c = null;
        try {
            c = surfaceHolder.lockCanvas(null);
            synchronized (surfaceHolder) {
                // This is where we draw the game state.
                gameEngine.drawGameFrame(c);
            }
        } finally {
            if (c != null) {
                surfaceHolder.unlockCanvasAndPost(c);
            }
        }
        sleepTime = FRAME_DELAY - ((System.nanoTime() - beforeTime)/1000000L);

        try {
            if(sleepTime > 0){
                Thread.sleep(sleepTime);
            }
        } catch (InterruptedException ex) {}
    }
}

当我尝试通过这样做安全地杀死它时:

    boolean retry = true;
    gameLoop.setLoopState(GameLoop.PAUSED);
    while (retry) {
        try {
            gameLoop.join();
            retry = false;
        } catch (InterruptedException e) {}
    }

它永远不会从gameLoop.join()行返回(我用调试器检查过它)。 setLoopState方法非常简单,它只是更改了我的游戏循环的state字段。 为什么会这样?

编辑:我在游戏循环的while循环的开头添加了System.out.println("State: " + state);行,并且在执行join()方法后没有打印任何内容。

EDIT2:我知道这里有什么不对。你需要花费太多的地方和时间来发布我整个游戏的代码,但我会试着解释一下。游戏循环执行我的游戏引擎的processGameTick()方法,然后检查某些内容以及何时发生(满足条件'某事'),游戏引擎在另一个对象中执行一个方法,然后调用stopEngine方法执行上面发布的第二个代码清单(以boolean retry = true开头的那个)。

这是否意味着一切都在一个线程上运行:特别是游戏循环线程,它最终会调用.join()?如果是这样,我该如何以其他方式解决?

如果你不理解我刚刚说的话,请告诉我。如果需要,我甚至可以用图片来解释这个。

0 个答案:

没有答案