当前位置: 首页 > 面试题库 >

仅当while true循环中存在System.out.println()时,线程才能正确运行

龙逸清
2023-03-14
问题内容

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

@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);
    }

}}

最后说明:传入布尔值upPresses和downPressed,我唯一要关注的是:

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

问题答案:

像这样的循环

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

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

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

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

甚至更好的是使用 事件驱动的方法
(例如使用)java.util.Timer。(那将是Java惯用的。)



 类似资料:
  • 我正在寻求帮助,以解决从一个剧本中运行具有相同角色的应用程序的多个版本(不同变量)的问题。 我们有一个具有多个产品系列的应用程序,这些产品系列是不同的代码版本。每个版本都有单独的uWSGI附庸配置和Nginx虚拟主机配置(/api/v2,/api/v3,...). 理想的状态应该是运行剧本并用指定的所有版本配置服务器。 遗憾的是,ansible的< code > import _ role/imp

  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像

  • 当我执行这段代码时,输出是“140”,也就是“28*5”,但它应该是“150”,也就是“28+31+30+31+30”,它应该计算两个月“2月”和“7月”之间的天数...所以这意味着for循环不能正常工作还是怎么的?为什么会这样!你能帮我一下吗??PS:我试图将循环中的j++更改为j+1,但Android Studio说“这不是一个声明”

  • 问题内容: 我的JSP页面(jQuery 1.7.2)中有以下jQuery代码: 在执行此代码之前,将注册一个和侦听器。像这样: 整个页面可以在http://alpha.sertal.ch:8181/VisionWeb/data- details/#data:12300923 下访问 您甚至可以登录。用户:Alsoft03密码:密码 第一次进行ajax调用时应该发生的是401错误,因为用户未登录。

  • 问题内容: 我是Java中的多线程和同步的新手。我正在尝试实现一项任务,其中给了我5个文件,每个文件将由一个特定线程读取。每个线程应从文件读取一行,然后将执行转发到下一个线程,依此类推。当所有5个线程都读取第一行时,然后再次从线程1运行行号开始。文件1中的2,依此类推。 并且在ReadFile(在run方法中实现Runnable的情况下,我正在尝试在bufferreader对象上进行同步。 需要帮

  • 我是java多线程和同步的新手。我试图实现一个任务,其中我给了5个文件,每个文件将由一个特定的线程读取。每个线程应该从文件中读取一行,然后将执行转发给下一个线程,依此类推。当所有5个线程读取第一行时,再次从线程1开始运行文件1的第2行,依此类推。 并且在ReadFile(实现Runnable的,在run方法中,我正在尝试在缓冲区读取器对象上同步。 需要帮助