100%的cpu,因为这个线程是java

100%的cpu,因为这个线程是java,java,Java,我刚刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康会下降。问题是,当我检查这个,CPU是在100%,一切都很滞后。这是一个问题。以下是我正在使用的线程: package Graphics; import java.util.logging.Level; import java.util.logging.Logger; public class BulletCollision implements Runnable { Player1 player1 =

我刚刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康会下降。问题是,当我检查这个,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);
             }
         }
     }
  }
封装图形;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类BulletCollision实现可运行{
Player1 Player1=新的Player1();
Player2 Player2=新的Player2();
公共线程checkBulletCollision=新线程(此);
公共无效checkPlayerBulletCollide(){
如果(player2.getBulletX()>player1.getX()&&
player2.getBulletX()

我很确定这就是问题所在。编译或运行时没有错误。如果有人能帮上忙,那就太棒了!我只是创建了这个类,所以代码并不完美。为了解决这个问题,我做了很多尝试,在我的Display类中调用了Threads start()方法,它只显示JFrame。我以前在我的一个球员分类中使用了start方法

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

while(true) {
    checkPlayerBulletCollide();
    try {
        checkBulletCollision.sleep(100);
    } catch (InterruptedException ex) {
        Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
    }
}
每帧只执行一次,我会从绘图逻辑调用
checkPlayerBulletCollide()

还要注意的是,
Thread.sleep()
是一个静态函数,所以你不能让一个特定的线程实例从另一个线程进入睡眠状态,Threac只能让自己进入睡眠状态

编辑如果您想编写简洁明了的代码(这非常好),我建议您使用Java 1.5上的锁定机制

即使这不是轻量级的ebough(在当前2个用户各有1个项目符号的情况下),我还是会使用一个。检查线程必须发出queue.take(),但实际的整数值无关紧要(稍后,例如,如果有更多项目符号或播放器,您可以在队列中放置对象,指定要检查的项目符号和用户…)。绘图逻辑-或控制绘图的逻辑将执行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.
            }
        }
    }
}
公共类BulletCollision实现可运行{
Player1 Player1=新的Player1();
Player2 Player2=新的Player2();
public BlockingQueue checkQueue=新建LinkedBlockingQueue();
公共无效checkPlayerBulletCollide(){
如果(player2.getBulletX()>player1.getX()&&player2.getBulletX()

另外,当你画完一个框架后,你应该发出一个
queue.offer(0)

问题不在此代码中。有一个或两个缺陷,但在这段代码中没有任何会导致滞后。。。据我所知


FWIW,缺陷如下:

1) 这是一种糟糕的风格:

  checkBulletCollision.sleep(100);
Thread.sleep
方法是静态的,因此您应该如下调用它:

  Thread.sleep(100);

2) 如果线程
run()
方法收到中断,它应该返回。你已经把它编码好了,可以继续。。。如果你需要更多的细节,比如我的类的层次结构,所有的方法,int等都是从那里来的,那就去问吧。但我认为没必要。你试过使用剖面仪吗?不,图纸不是逻辑。将动画隔离到模型中,且绘图必须仅为绘图。@Aubin我理解您在将业务逻辑与视觉分离方面所做的努力-这很好。但有时性能要求迫使我们使用不太清晰的解决方案(DB表的非规范化就是其中之一)。我会用更好的方法更新我的答案。你的意思是只使用这个方法而不使用新线程吗?因为无论哪种方式都需要100%cpu@user1776707瓶颈也可能在其他地方。。如果你能在这里粘贴一些代码。。稍后我可以看一看。你能帮我解决另一个问题吗?你能帮我了解bulletX的价值吗?在上面的代码中,bullet x受int bullet x保护,player2扩展了具有int的类。但是从上面的类中,bullet x的值始终为0?为什么会这样?