因为这个线程java 100%的cpu

时间:2012-10-27 07:43:15

标签: java

我刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康状况会下降。问题是当我检查这个时,CPU是100%而且一切都太迟了。这是个问题。这是我正在使用的主题:

 package Graphics;

 import java.util.logging.Level;
 import java.util.logging.Logger;


 public class BulletCollision implements Runnable {
     Player1 player1 = new Player1();
     Player2 player2 = new Player2();

     public Thread checkBulletCollision = new Thread(this);

     public void checkPlayerBulletCollide() {
         if (player2.getBulletX() > player1.getX() && 
             player2.getBulletX() < player1.getX() - 50) {
            player2.decHealth(50);
         }
     }

     @Override
     public void run() {
         while(true) {
             checkPlayerBulletCollide();
             try {
                 checkBulletCollision.sleep(100);
             } catch (InterruptedException ex) {
                 Logger.getLogger(BulletCollision.class.getName()).log(
                     Level.SEVERE, null, ex);
             }
         }
     }
  }

我很确定这就是问题所在。编译或运行时没有错误。如果有人能帮助那将是惊人的!而我只是创建这个类,所以代码并不完美。我已经尝试了很多来解决这个问题,我的Display类中只调用了Threads start()方法,它只显示JFrame。我以前在我的一名球员中获得了开始方法。

2 个答案:

答案 0 :(得分:0)

在我看来,在这种情况下,在单独的线程中使用此块自由运行是不正确的。

while(true) {
    checkPlayerBulletCollide();
    try {
        checkBulletCollision.sleep(100);
    } catch (InterruptedException ex) {
        Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我每帧只执行一次,我会从绘图逻辑中调用checkPlayerBulletCollide()

另请注意Thread.sleep()是一个静态函数,所以你不能让一个特定的Thread实例从另一个Thread中休眠,一个Threac可以让自己睡觉......

编辑如果你想编写好的和干净的代码(非常好),我建议使用Java 1.5中的锁定机制。

即使这是(在2个用户的当前上下文中每个1个子弹)不轻量级,我使用BlockingQueue。检查线程必须发出queue.take(),但实际的Integer值无关紧要(稍后例如使用更多的子弹或玩家,您可以在队列中放置指定哪些子弹和哪些用户要检查的对象。 ..)。绘图逻辑 - 或控制绘图的逻辑将执行queue.offer(0)。检查线程看起来像这样:

public class BulletCollision implements Runnable{

    Player1 player1 = new Player1();
    Player2 player2 = new Player2();

    public BlockingQueue<Integer> checkQueue = new LinkedBlockingQueue<Integer>();
    public void checkPlayerBulletCollide() {
        if(player2.getBulletX() > player1.getX() && player2.getBulletX() < player1.getX() -50) {
            player2.decHealth(50);

        }
    }

    @Override
    public void run() {
        while(true) {
            try {
                queue.take();
                checkPlayerBulletCollide();
            } catch (InterruptedException ex) {
                Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
                break; //I'd put this here. If we were interrupted, the hread should stop gracefully.
            }
        }
    }
}

此外,当您完成绘制框架时,您应该发出queue.offer(0);

答案 1 :(得分:0)

问题不在此代码中。有一两个缺陷,但是在这段代码中没有任何内容会导致延迟......据我所知。


FWIW,缺陷如下:

1)这是不好的风格:

  checkBulletCollision.sleep(100);

Thread.sleep方法是静态的,因此您应该将其调用为:

  Thread.sleep(100);

2)如果收到中断,你的线程run()方法应该返回。你已经对它进行了编码以继续......这将打破打断它的目的。