如何在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中使用wait
和notify
或notifyAll
方法时,必须记住以下事项:
notifyAll
而不是notify
。 wait
和notify
方法必须在同步的上下文中调用。 请参阅链接以获取更详细的解释。 wait()
方法,因为如果多个线程正在等待一个锁,并且其中一个线程获得了锁并重置了该条件,那么其他线程在唤醒后需要检查它们是否需要再等一等,或者可以开始处理。 wait()
和notify()
方法; 每个对象都有自己的锁,所以在对象A上调用wait()
和在对象B上调用notify()
都没有任何意义。 你需要线程吗? 我想知道你的矩阵有多大,是否有一个线程打印而另一个线程打印有好处。
在进行相对复杂的线程工作之前,这次或许值得一试?
如果你确实需要对它进行线程化,我会创建'n'个线程来执行单元的乘法(可能'n'是你可用的内核数量),然后使用ExecutorService和Future机制来同时分派多个乘法。
这样,您可以根据内核数量优化工作,并且您正在使用更高级别的Java线程工具(这会让生活更轻松)。 将结果写回到接收矩阵中,然后在所有未来任务完成后再打印。
链接地址: http://www.djcxy.com/p/76263.html