java - 只有在 while true 循环中有 System.out.println() 时线程才能正确运行

标签 java multithreading

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

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

}

它工作正常,但如果我删除 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);
    }

}}

最后说明:忽略 boolean 值 upPresses 和 downPressed,我唯一关注的是:

if (e.getKeyCode() == KeyEvent.VK_UP) {
    y -= speed;
}

最佳答案

像一个循环

while(true) {
    updatePos(x, y);
}

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

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

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

或者,更好的是,采用事件驱动的方法,例如 java.util.Timer . (这会更符合 Java 的习惯。)

关于java - 只有在 while true 循环中有 System.out.println() 时线程才能正确运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140548/

相关文章:

java - java.io.BufferedOutputStream 可以安全使用吗?

java - 如何用Java解析请求?

java - 如何检查我是否可以删除文件?

C - 通过 FIFO 将在线程中创建的 PIPE FD 发送到父进程

java - 从Java中的线程调用JMX连接?

java - 当某些线程执行其任务时,阻止特定线程参与线程调度程序

java - @Autowired 不能在可运行的内部工作

java - 无法实例化扩展应用程序类的应用程序错误

multithreading - 如何同时(并行)在远程计算机上调用-命令相同的功能

Java swing UI线程和事件按钮事件