如何在Java中使用wait和notify而不出现IllegalMonitorStateException?

2023-11-21

我有 2 个矩阵,我需要将它们相乘,然后打印每个单元格的结果。一旦一个单元格准备好,我就需要打印它,但例如我需要在单元格 [2][0] 之前打印 [0][0] 单元格,即使 [2][0] 的结果先准备好。所以我需要按订单打印。 所以我的想法是让打印机线程等到multiplyThread通知它正确的单元格已准备好打印,然后printerThread将打印单元格并返回等待等等..

所以我有这个线程来执行乘法:

public void run() 
{
    int countNumOfActions = 0; // How many multiplications have we done
    int maxActions = randomize(); // Maximum number of actions allowed

    for (int i = 0; i < size; i++)
    {       
        result[rowNum][colNum] = result[rowNum][colNum] + row[i] * col[i];
        countNumOfActions++;
        // Reached the number of allowed actions
        if (countNumOfActions >= maxActions)
        {
            countNumOfActions = 0;
            maxActions = randomize();
            yield();
        }   
    }
    isFinished[rowNum][colNum] = true;
    notify();
}

打印每个单元格结果的线程:

public void run()
{
    int j = 0; // Columns counter
    int i = 0; // Rows counter
    System.out.println("The result matrix of the multiplication is:");

    while (i < creator.getmThreads().length)
    {
        synchronized (this)
        {
            try 
            {
                this.wait();
            } 
            catch (InterruptedException e1) 
            {
            }
        }
        if (creator.getmThreads()[i][j].getIsFinished()[i][j] == true)
        {
            if (j < creator.getmThreads()[i].length)
            {
                System.out.print(creator.getResult()[i][j] + " ");
                j++;
            }
            else
            {
                System.out.println();
                j = 0;
                i++;
                System.out.print(creator.getResult()[i][j] + " ");
            }
        }
    }

现在它向我抛出这些异常:

Exception in thread "Thread-9" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-6" Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-5" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-8" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-7" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-11" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-10" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)
Exception in thread "Thread-12" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at multiplyThread.run(multiplyThread.java:49)

第 49 行multiplyThread是“notify()”..我想我需要以不同的方式使用同步,但我不知道如何使用。

如果有人可以帮助这段代码工作,我将非常感激。


为了能够打电话notify()您需要在同一对象上同步。

synchronized (someObject) {
    someObject.wait();
}

/* different thread / object */
synchronized (someObject) {
    someObject.notify();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Java中使用wait和notify而不出现IllegalMonitorStateException? 的相关文章

随机推荐

  • 定义内部枚举[重复]

    这个问题在这里已经有答案了 在linux内核源代码中 我看到在枚举内部 是否还有一个与枚举元素同名的定义 示例中linux rtnetlink h我们有 enum RTM BASE 16 define RTM BASE RTM BASE R
  • 循环引用和 WCF

    我已经使用 POCO Generator 生成了 POCO 实体 我的数据库中有超过 150 个表 我在整个应用程序层 包括客户端 共享 POCO 实体 我在我的上下文中禁用了 LazyLoading 和 ProxyCreation 我在数
  • 在不知道xml文件结构的情况下解析xml文件内容

    我一直在学习一些使用 java 解析文件的新技术 对于 msot 部分 进展顺利 但是 我不知道如何将 xml 文件解析到收到后结构未知的位置 如果您知道结构的话 有很多关于如何执行此操作的示例 getElementByTagName 似乎
  • 如何获取android中加载mapview的进度状态?

    当地图处于加载状态时 我想在地图视图的中心放置一个进度条 如何获得进度 以及怎么办 给我一些例子 thanks 我认为没有任何合理的方法可以做到这一点 请注意 谷歌在其地图应用程序中也没有这样做 只需查看页面即可清楚地了解图块是否仍在加载
  • Spring security - oauth2 资源服务器测试

    我在使用 WebMvcTest 和 POST HTTP 方法测试 oauth2 资源服务器时遇到一些问题 当我不发送 csrf 令牌时 我总是收到 403 状态代码 即使当我使用不记名令牌时不需要该令牌 这是我要测试的 POST 方法 Po
  • 保持回发时的页面位置

    我有个问题
  • 从 URL 获取路径

    寻找一种从 PHP 中的 URL 获取路径的方法 我要拿 http example com hurrdurr 并做到 hurrdurr 我只想要后面的文字 com 我可以用修剪来做到这一点吗 Use parse url来提取你想要的信息 例
  • 为什么“fputc”使用 INT 作为参数而不是 CHAR?

    标准 C 库 int fputc int c FILE stream 并且这样的行为多次发生 例如 int putc int c FILE stream int putchar int c 为什么不直接使用 CHAR 呢 如果必须使用 IN
  • 通过 Gmail API 发送多部分/签名电子邮件 (RFC 3156)

    尝试构建符合 RFC3156 0 的消息 并通过 Gmail API 发送它 我正在使用 python 客户端实现 我得到的是 在我的 Gmail 邮箱中 邮件已正确发送 我看到的正是我之前构建的邮件 我的接收者得到的是 一条 多部分 混合
  • 通过 Promise 配置多种功能

    这是对使用量角器设置 firefox 配置文件 topic 根据setFirefoxProfilehowto 可以使用特殊的方式设置 firefox 配置文件 助手 js代码它使用firefox profile and q动态生成编码的 F
  • 如何使用 PHP Composer 从 Laravel 中删除包?

    使用 PHP Composer 从 Laravel 中删除包的正确方法是什么 到目前为止我已经尝试过 从文件中删除声明作曲家 json 在 要求 部分 删除任何类别名从文件app php 从我的代码中删除对该包的任何引用 Run compo
  • 如何在 C Makefile 中使用外部库和头文件?

    我在directory1中有一个头文件myheader h和一个静态库libmylib a文件 在directory2 中 我正在编写一个使用它们的程序 假设我在directory2中有main c 它使用myheader h和libmyl
  • JS 中“.innerHTML”和“.value”的区别

    我很困惑之间有什么区别 innerHTML and value在 JavaScript 中 这是我的代码 Input string
  • 如何将 postgres json 转换为整数

    我可以用to json 1 将 int 转换为 json 但如何将 json 转换为 int 这可能太慢了 to json 1 text int 另外 json 是从二进制块 bson 包装的还是简单的文本包装 对我有用的 使用 postg
  • $http 不在请求中发送 cookie

    We are working on a RESTful Webservice with AngularJS and Java Servlets When the user logs in our backend sends a Set Co
  • Java 11:补丁 sun.misc.BASE64Encoder

    这个问题不是重复的java lang NoClassDefFoundError sun misc BASE64Encoder 我正在尝试更新我的应用程序中的 Java 版本 至 11 并且我的应用程序中的库之一使用sun misc BASE
  • WPF 主题可以用于包含可在运行时更改的应用程序的多个外观吗?

    WPF 允许控件库为不同的系统主题提供不同的资源字典 本质上允许应用程序匹配操作系统选择的视觉主题 Aero Luna 等 我想知道是否可以在我的应用程序中包含多个主题资源字典 并利用框架内的一些现有主题支持 这应该适用于我自己的主题名称
  • 在 matplotlib 中围绕散点图中的数据点绘制平滑的多边形

    我有一堆带有两组数据的交叉图 并且一直在寻找一种 matplotlib 方法来用平滑的多边形轮廓突出显示它们的绘制区域 At the moment i just use Adobe Illustrator and amend saved p
  • Postgresql GROUP_CONCAT 等效吗?

    我有一张表 我想为每个 id 提取一行并连接字段值 例如 在我的表中 我有这个 TM67 4 32556 TM67 9 98200 TM67 72 22300 TM99 2 23009 TM99 3 11200 我想输出 TM67 4 9
  • 如何在Java中使用wait和notify而不出现IllegalMonitorStateException?

    我有 2 个矩阵 我需要将它们相乘 然后打印每个单元格的结果 一旦一个单元格准备好 我就需要打印它 但例如我需要在单元格 2 0 之前打印 0 0 单元格 即使 2 0 的结果先准备好 所以我需要按订单打印 所以我的想法是让打印机线程等到m