如何在Java中使用wait和notify?

我有2个矩阵,我需要将它们相乘,然后打印每个单元格的结果。 只要一个单元准备好我需要打印,但是例如我需要打印[0] [0]细胞前细胞[2]即使的结果[2] [0]是准备第一[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)

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

如果任何人都可以帮助这个代码工作,我会非常感激。


为了能够调用notify(),你需要在同一个对象上进行同步。

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

/* different thread / object */
synchronized (someObject) {
    someObject.notify();
}

在Java中使用waitnotifynotifyAll方法时,必须记住以下事项:

  • 如果您期望多个线程将等待锁定,请使用notifyAll而不是notify
  • waitnotify方法必须在同步的上下文中调用。 请参阅链接以获取更详细的解释。
  • 总是在一个循环中调用wait()方法,因为如果多个线程正在等待一个锁,并且其中一个线程获得了锁并重置了该条件,那么其他线程在唤醒后需要检查它们是否需要再等一等,或者可以开始处理。
  • 使用相同的对象来调用wait()notify()方法; 每个对象都有自己的锁,所以在对象A上调用wait()和在对象B上调用notify()都没有任何意义。

  • 你需要线程吗? 我想知道你的矩阵有多大,是否有一个线程打印而另一个线程打印有好处。

    在进行相对复杂的线程工作之前,这次或许值得一试?

    如果你确实需要对它进行线程化,我会创建'n'个线程来执行单元的乘法(可能'n'是你可用的内核数量),然后使用ExecutorService和Future机制来同时分派多个乘法。

    这样,您可以根据内核数量优化工作,并且您正在使用更高级别的Java线程工具(这会让生活更轻松)。 将结果写回到接收矩阵中,然后在所有未来任务完成后再打印。

    链接地址: http://www.djcxy.com/p/76263.html

    上一篇: How to use wait and notify in Java?

    下一篇: Synchronizing on other objects in java