Saya memiliki 2 matriks dan saya perlu melipatgandakannya dan kemudian mencetak hasil dari setiap sel. Segera setelah satu sel siap saya perlu mencetaknya, tetapi misalnya saya perlu mencetak sel [0] [0] sebelum sel [2] [0] bahkan jika hasil [2] [0] siap terlebih dahulu . Jadi saya perlu mencetaknya berdasarkan pesanan. Jadi ide saya adalah membuat utas printer menunggu sampai multiplyThread
memberitahukan bahwa sel yang tepat siap untuk dicetak dan kemudian printerThread
akan mencetak sel dan kembali menunggu dan seterusnya ..
Jadi saya punya utas ini yang melakukan multiplikasi:
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();
}
Utas yang mencetak hasil dari setiap sel:
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] + " ");
}
}
}
Sekarang ini melempar saya pengecualian ini:
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)
baris 49 in multiplyThread
adalah "notify ()" .. Saya pikir saya perlu menggunakan sinkronisasi tetapi saya tidak yakin bagaimana caranya.
Jika ada yang bisa membantu kode ini bekerja, saya akan sangat menghargainya.
while(!JobCompleted);
pilihan adalah biasanya ide yang buruk karena mengikat CPU Anda di 100% memeriksa variabel yang sama terus-menerus (lihat di sini )