java - (可能)非常简单的Java多线程问题

标签 java multithreading runtime-error

我正在制作一款平台游戏,让玩家每 30 毫秒跳跃一次,并向上添加少量的力。我想我应该使用多线程,因为我之前已经做过一些,而且看起来很简单。无论如何,我尝试了这个:

public void jump() {
    new Runnable() {
        public void run() {
            for (int i = 0; i <= jumpForce; i++) {
                velocity.y++;
                System.out.println("Adding force");
                try {
                    wait(30);
                } catch (InterruptedException e) {}
            }
        }
    }.run();
}

现在,我认为这会做的是从0到jumpForce(在本例中为50)的每个循环,它在y速度变量上加1,然后等待30ms,但实际发生的是我收到一个名为:

的错误
java.lang.IllegalMonitorStateException

我不知道这意味着什么,所以有人可以告诉我我做错了什么吗?

最佳答案

如果您想在不同的线程中执行此代码,那么您不应该调用 Runnable 的 run() 方法。您应该做的是创建线程的实例并将 Runnable 实现放入其构造函数中。 然后调用.start()

 public void jump() {
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i <= jumpForce; i++) {
                    velocity.y++;
                    System.out.println("Adding force");
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {}
                }
            }
        }).start();
    }

此外,在这种情况下,您应该sleep()线程而不是wait(),因为您尚未获取对象锁。为了使用 wait() 实现您需要的功能,jump() 方法必须synchronized 并且另一个线程必须调用它。

关于java - (可能)非常简单的Java多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420183/

相关文章:

java - 多态性与策略模式

java - 我需要知道java如何实现函数Color.RGBtoHSB(r, g, b, hsb)的详细信息。他们是否标准化 r、g、b

java - 了解 ReusableBarrier 问题(来自 'Little Book of Semaphores' )

java - 文档未保存在 Spring jpa 文档管理器应用程序中

javascript - 说 Node.js 和 JavaScript 提供基于事件循环的并发模型是不正确的吗?

multithreading - 从不同的线程读取值

windows - IBM API 的 Python 多处理错误(Q Experience)

java - 意外的多线程结果和计时

runtime-error - 安装了 dbt 并且工作正常,但是获取 db cmdlet,功能错误

swift - 使用 Firebase 登录时为 "An error occurred while accessing the keychain"