簡體   English   中英

如何等待線程完成其工作

[英]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();
    }
}
  1. 不要將GUI事件線程與while (true)wait() 您的GUI將凍結(此時不確定您是否正在執行此操作)。
  2. 如果是Swing應用程序,請不要使用KeyListener,而是使用Key Bindings。 嘖嘖將告訴你如何。
  3. 使用Swing Timer代替您的等待或等待。 按鍵啟動計時器並在按鍵釋放時停止計時器。 在這個網站和其他網站上可以找到很多這樣的例子,其中有幾個是我寫的。

例如,看看這個問題的答案代碼 ,包括camickr's,Trashgod和我的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM