如果在while true循环中有System.out.println(),则线程只能正确运行

Der*_*rek 3 java multithreading

基本上,我正在制作一个更新玩家位置的游戏,它使用这个帖子:

@Override
public void run() {
    while(true) {
        System.out.println();
        updatePos(x, y);
    }

}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但如果我删除System.out.println(),它就会停止运行.我不知道为什么会这样,全班如下:

public class Player extends Block implements KeyListener, Runnable {

int x;
int y;
int speed;

boolean upPressed; 
boolean downPressed;
boolean rightPressed;
boolean leftPressed;

static Sprite sprite = new Sprite("grass.png");

public Player(int x, int y, int speed) {
    super(x, y, sprite);
    this.x = x;
    this.y = y;
    this.speed = speed;
    Thread playerThread = new Thread(this, "Player Thread");
    playerThread.start();
}

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        y -= speed;
    }

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
        downPressed = true;

    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        rightPressed = true;

    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        leftPressed = true;

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP)
        upPressed = false;

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
        downPressed = false;

    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        rightPressed = false;

    if (e.getKeyCode() == KeyEvent.VK_LEFT)
        leftPressed = false;

}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void run() {
    while(true) {
        System.out.println();
        updatePos(x, y);
    }

}}
Run Code Online (Sandbox Code Playgroud)

最后的注意事项:Ingore boolean upPresses和downPressed,我唯一关注的是:

if (e.getKeyCode() == KeyEvent.VK_UP) {
    y -= speed;
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 7

像一个循环

while(true) {
    updatePos(x, y);
}
Run Code Online (Sandbox Code Playgroud)

会完全占用CPU.使用a开始表现更好的原因println可能是因为I/O每次迭代产生几百个周期.

我建议你根据所需的帧率添加一个小的睡眠方法:

while (true) {
    try {
        Thread.sleep(10); // for 100 FPS
    } catch (InterruptedException ignore) {
    }
    updatePos(x, y);
}
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,采用事件驱动的方法,例如a java.util.Timer.(这将是Java惯用语.)

  • @Kublai:可能更多,因为`System.out.println`是同步的. (4认同)