java - 如何在java中正确使用wait()和notify线程?

标签 java android multithreading

我正在 android studio 中制作 2D 游戏,几天来我一直在解决一个问题。我想停止我的线程 Gravity,以便我的玩家可以跳跃。当玩家完成跳跃后,重力线程可以继续。

我在互联网上搜索了如何将 wait() 和 notification() 与同步块(synchronized block)一起使用。但当我尝试应用它时,我的重力就不会停止。如果有人能告诉我如何正确使用它,我会非常高兴......

这是我在场景类中开始跳跃的代码。

public void recieveTouch(MotionEvent event) {

    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            if(player.getPoint().y > 0) {
                playerJump();
            }
    }
}

public void playerJump(){
    playerJump = new Jump(player, this);
    thread = new Thread(playerJump);
    thread.setDaemon(true);
    thread.start();
}

这是我的重力线程。

public class Gravity implements Runnable {

private Player player;
private GameScene gameScene;

public Gravity (Player player, GameScene gameScene){
    this.player = player;
    this.gameScene = gameScene;
}

@Override
public void run(){
    while(true){

        player.playerMoveDown(3);
        gameScene.update();

        try {
            Thread.sleep(25);
        }
        catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

这是我的跳转线程。

public class Jump implements Runnable {

private Player player;
private GameScene gameScene;

public Jump (Player player, GameScene gameScene){
    this.player = player;
    this.gameScene = gameScene;
}

@Override
public void run(){
    int eindHoogte = player.getPoint().y - 60;

        while (player.getPoint().y > eindHoogte) {
            player.playerMoveUp(3);
            gameScene.update();

            try {
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
}

最佳答案

假设您将相同的玩家对象传递给 Jump 和 Gravity 类,您可以在玩家上同步并维护跳跃完成操作的标志。

这将确保当玩家执行跳跃操作时重力会等待跳跃操作,并且只有在玩家跳跃时才会再次继续

flag只是为了防止一个线程调用notify()方法发送的通知在另一个线程没有调用wait()之前被错过的情况

请参阅下面的示例代码

    public class Jump implements Runnable {

    private Player player;
    private GameScene gameScene;

    public Jump (Player player, GameScene gameScene){
        this.player = player;
        this.gameScene = gameScene;
    }

    @Override
    public void run(){
        int eindHoogte = player.getPoint().y - 60;

        while (player.getPoint().y > eindHoogte) {
                player.playerMoveUp(3);
                gameScene.update();

                try {
                    Thread.sleep(25);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }

        synchronized(player){

            // acts as a signal to gravity thread to start processing the gravity operation
            player.setJumpComplete(true);
        }

    }

}


    public class Gravity implements Runnable {

        private Player player;
        private GameScene gameScene;

        public Gravity (Player player, GameScene gameScene){
            this.player = player;
            this.gameScene = gameScene;
        }

        @Override
        public void run(){



            while(true){

                synchronized (player) {

                    // if player has completed the jump then process the gravity operation else just wait for jump to complete
                    if(player.isJumpComplete()){
                        player.playerMoveDown(3);
                        gameScene.update();

                        // reset the jump flag and wait for the next jump operation to complete
                        player.setJumpComplete(false);
                    }

                }

                try {
                    Thread.sleep(25);
                }
                catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }

关于java - 如何在java中正确使用wait()和notify线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42090075/

相关文章:

java - 有人能帮我弄清楚如何从 ":"(不包括)读取我的文件直到行尾吗?

android - 如何从 facebook sdk 获取用户生日?

android - 使用 android gradle 工具 1.10.+ 获取 android sdk 目录

java - 解决 java.lang.OutOfMemoryError : Java heap space

c++ - 使用 QThreads 与多个硬件设备通信

java - 通过数据报套接字发送对象java

java - 这是 Java 中构建器模式的有效使用(甚至是良好的 OO 设计)吗?

java - JDK 1.6 和 1.7 之间的 DateFormat 格式 ROC 年份

java - 带有 EXTRA_OUTPUT 的 Android Intent MediaStore.ACTION_VIDEO_CAPTURE 在播放时崩溃,重拍

multithreading - 使用 HTTPS 和多线程进行 Curl