2 matrisim var ve onları çarpmam ve ardından her hücrenin sonuçlarını yazdırmam gerekiyor. Bir hücre hazır olur olmaz onu yazdırmam gerekiyor, ancak örneğin [2] [0] hücresinin sonucu önce hazır olsa bile [0] [0] hücresini [2] [0] hücresinden önce yazdırmam gerekiyor . Bu yüzden siparişe göre yazdırmam gerekiyor. Bu yüzden benim fikrim, yazıcı iş parçacığının multiplyThread
doğru hücrenin yazdırılmaya hazır olduğunu bildirene kadar beklemesini sağlamak ve ardından printerThread
hücreyi yazdırıp beklemeye geri dönmek vb.
Bu yüzden, çarpmayı yapan şu iş parçacığına sahibim:
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();
}
Her hücrenin sonucunu yazdıran iş parçacığı:
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] + " ");
}
}
}
Şimdi bana şu istisnaları atıyor:
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. satır multiplyThread
"notify ()" dır .. Senkronize edileni farklı kullanmam gerektiğini düşünüyorum ama nasıl olduğundan emin değilim.
Bu kodun çalışmasına yardım edebilecek biri varsa gerçekten minnettar olacağım.
while(!JobCompleted);
seçenek genellikle kötü bir fikirdir çünkü CPU'nuzu% 100 bağlayarak aynı değişkeni sürekli kontrol eder ( buraya bakın )