मेरे पास 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)
लाइन 49 में multiplyThread
"सूचित ()" है .. मुझे लगता है कि मुझे अलग से सिंक्रनाइज़ का उपयोग करने की आवश्यकता है लेकिन मुझे यकीन नहीं है कि कैसे।
अगर कोई इस कोड को काम करने में मदद कर सकता है तो मैं वास्तव में इसकी सराहना करूंगा।
while(!JobCompleted);
विकल्प आम तौर पर एक बुरा विचार है क्योंकि यह 100% लगातार एक ही चर जाँच पर अपने CPU ऊपर बांध (देखें है यहाँ )