[英]How to wait until a thread completes its work
我有一個運動線程,聽取運動。 我可以讓它在while循環中運行,但是當沒有發生移動時,Thread會達到100%的CPU使用率,因為它只是一遍又一遍地通過while循環。
我想要做的是讓它在完成它的動畫之后休眠,當我按下一個鍵時將其喚醒
當我按下箭頭鍵時,我會向一個方向移動,直到我松開。 moveThread在此時等待,但當我按下另一個鍵或相同的鍵時,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();
}
}
while (true)
或wait()
。 您的GUI將凍結(此時不確定您是否正在執行此操作)。 例如,看看這個問題的答案代碼 ,包括camickr's,Trashgod和我的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.