Ich habe 2 Matrizen und ich muss sie multiplizieren und dann die Ergebnisse jeder Zelle drucken. Sobald eine Zelle bereit ist, muss ich sie drucken, aber zum Beispiel muss ich die Zelle [0] [0] vor Zelle [2] [0] drucken, selbst wenn das Ergebnis von [2] [0] zuerst bereit ist . Also muss ich es auf Bestellung ausdrucken. Meine Idee ist es also, den Druckerthread warten zu lassen, bis er multiplyThread
benachrichtigt, dass die richtige Zelle zum Drucken bereit ist, und dann printerThread
die Zelle zu drucken und wieder zu warten und so weiter.
Also habe ich diesen Thread, der die Multiplikation macht:
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();
}
Thread, der das Ergebnis jeder Zelle druckt:
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] + " ");
}
}
}
Jetzt wirft es mir diese Ausnahmen:
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)
Zeile 49 in multiplyThread
ist das "notify ()". Ich denke, ich muss das synchronisierte anders verwenden, aber ich bin nicht sicher, wie.
Wenn jemand helfen kann, dass dieser Code funktioniert, werde ich ihn wirklich schätzen.
while(!JobCompleted);
Option ist im Allgemeinen eine schlechte Idee, da sie Ihre CPU zu 100% bindet und ständig dieselbe Variable überprüft (siehe hier )