2013-09-11 34 views
0

我有一个运动线程,用于监听运动。我可以让它通过while循环运行,但是当没有移动发生时,线程会占用100%的CPU使用量,因为它只是一遍又一遍地经历while循环。如何等待线程完成其工作

我所试图做的就是把这个线程睡觉它完成的动画,并唤醒它,当我按一个键

当我按箭头键,我将在一个方向移动直到我放开。这时移动线程等待,但是当我按下另一个键或同一个键时,keyListener不响应。 Keylistener没有响应,因为当我拨打电话时

waitMovementThread(); 

它永远不会离开同步的对象。 Idk最新错误,或者我应该如何解决这种情况。

private void keyListeners(){ 
    GlobalObjects.frame.addKeyListener(new KeyListener() { 
     @Override 
     public void keyPressed(KeyEvent e) { 

      //Up = 38 
      //Down = 40 
      //Left = 37 
      //Right = 39 
      System.out.println("Keypressed"); 
      if(e.getKeyCode() == 16){ 
       player.setPlayerMovementSpeed(3); 
      } 
      if(e.getKeyCode() == 38){ 
       notifyMovementThread(); 
       player.setPlayerMovement(1); 
      }else if(e.getKeyCode() == 40){ 
       notifyMovementThread(); 
       player.setPlayerMovement(2); 
      }else if(e.getKeyCode() == 37){ 
       notifyMovementThread(); 
       player.setPlayerMovement(3); 
      }else if(e.getKeyCode() == 39){ 
       notifyMovementThread(); 
       player.setPlayerMovement(4); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      if(e.getKeyCode() == 16){ 
       player.setPlayerMovementSpeed(10); 
      } 
      if(e.getKeyCode() == 38){ 
       if(player.getPlayerMovement() != 1){ 

       }else{ 
        player.setPlayerMovement(0); 
        waitMovementThread(); 
       } 
      }else if(e.getKeyCode() == 40){ 
       if(player.getPlayerMovement() != 2){ 

       }else{ 
        player.setPlayerMovement(0); 
        waitMovementThread(); 
       } 
      }else if(e.getKeyCode() == 37){ 
       if(player.getPlayerMovement() != 3){ 

       }else{ 
        player.setPlayerMovement(0); 
        waitMovementThread(); 
       } 
      }else if(e.getKeyCode() == 39){ 
       if(player.getPlayerMovement() != 4){ 

       }else{ 
        player.setPlayerMovement(0); 
        waitMovementThread(); 
       } 
      } 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 

     } 
    }); 
} 
private void waitMovementThread(){ 
    synchronized(movementThread){ 
     try { 
      movementThread.wait(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
private void notifyMovementThread(){ 
    synchronized(movementThread){ 
     movementThread.notify(); 
    } 
} 

回答

2
  1. 不要占用的GUI事件线程与while (true)wait()。你的图形用户界面将冻结(如果你正在这样做,不确定在这一点上)。
  2. 如果是Swing应用程序,请不要使用KeyListener,而要使用Key Bindings。 tut的将告诉你如何。
  3. 使用摆动计时器代替你的等待或等待。按下按键启动计时器,并在按键释放时停止。这个网站和其他网站上有很多这样的例子,其中有几个是我写的。

例如,看看this question's answer code,包括camickr's,Trashgod's和我的。