而Loop Loop Stalling Program

时间:2014-01-17 16:59:06

标签: java sockets loops while-loop

为什么我的while循环会冻结我的程序?

gameLoop()正在阻止我的其他程序进程。

    while (running) {
        if (Key.up) {
            player.moveCharacter(1, playerSpeed);
        } else if (Key.down) {
            player.moveCharacter(2, playerSpeed);
        } else if (Key.left) {
            player.moveCharacter(3, playerSpeed);
        } else if (Key.right) {
            player.moveCharacter(4, playerSpeed);
        }
    }

                        // listen for log in data
        while (true) {
            try {
                int direction = socketIn.readByte(); // player direction
                                                        // sent from server
                int px = socketIn.readByte(); // player px
                int py = socketIn.readByte(); // player py
                String username = socketIn.readUTF(); // player username

                player = new Player(direction, px, py, username); // create
                break;
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
        game.gameLoop(player);

game.gameLoop(播放器);如你所见,调用我的游戏循环,然而当它运行时,我的游戏抓住了继续它的其他过程。任何人都可以告诉我为什么会这样吗?我需要把它放在一个线程上吗?

5 个答案:

答案 0 :(得分:1)

您正在使用while(true),并且离开循环的唯一方法是使用break,但如果您在与管理GUI的线程相同的线程上拥有该代码,则GUI将冻结,用户将无法登录,因为GUI已被该循环冻结。

解决方案是将该代码设置在与主线程(管理GUI)不同的另一个线程上。

答案 1 :(得分:0)

你使用永远不会错误的while(true)。因此,循环永远不会中断,您的代码将继续永远重复。

答案 2 :(得分:0)

您正在使用while (true),因此它会不断检查密钥状态并执行代码块。而是每隔几秒(或几毫秒)检查一次

答案 3 :(得分:0)

是肯定的。如果你需要保持整个游戏的循环(登录后),那么你需要把它放在自己的线程中。

答案 4 :(得分:0)

我知道我已经迟到了几年,但希望它可以帮助任何人阅读

你可以为你的while循环条件使用一个标志

flag = true;
while(flag){

    //some code here

    if(condition)
        flag  = false;
}

if条件是退出循环的条件,即当你突破它时。