Tôi có 2 ma trận và tôi cần nhân chúng và sau đó in kết quả của từng ô. Ngay khi một ô sẵn sàng, tôi cần in nó, nhưng ví dụ tôi cần in ô [0] [0] trước ô [2] [0] ngay cả khi kết quả của [2] [0] đã sẵn sàng trước . Vì vậy, tôi cần phải in nó theo thứ tự. Vì vậy, ý tưởng của tôi là làm cho luồng máy in chờ cho đến khi multiplyThread
thông báo rằng ô chính xác đã sẵn sàng để in và sau đó printerThread
sẽ in ô và quay lại chờ và cứ thế ..
Vì vậy, tôi có chủ đề này làm phép nhân:
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();
}
Chủ đề in kết quả của mỗi ô:
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] + " ");
}
}
}
Bây giờ nó ném cho tôi những ngoại lệ:
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)
dòng 49 in multiplyThread
là "notify ()" .. Tôi nghĩ rằng tôi cần sử dụng đồng bộ hóa khác nhau nhưng tôi không chắc làm thế nào.
Nếu bất cứ ai có thể giúp mã này hoạt động tôi sẽ thực sự đánh giá cao nó.
while(!JobCompleted);
tùy chọn nói chung là một ý tưởng tồi vì nó gắn lên CPU của bạn ở mức 100% kiểm tra cùng một biến liên tục (xem ở đây )