Tôi có 2 ma trận và tôi cần nhân chúng và sau đó in kết quả của mỗi ô. Ngay sau 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 sự chờ đợi chủ đề máy in cho đến khi multiplyThread
thông báo đó mà các tế bào đúng là đã sẵn sàng để được in và sau đó là printerThread
sẽ in các tế bào và quay trở lại chờ đợi và vân vân ..Cách sử dụng chờ và thông báo bằng Java?
Vì vậy, tôi có chủ đề này mà không được 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 tế bào:
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 trường hợp 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 trong multiplyThread
là "thông báo()" .. Tôi nghĩ rằng tôi cần phải sử dụng đồng bộ hóa khác nhau nhưng tôi không chắc chắn như thế nào.
Nếu có ai đó có thể giúp mã này hoạt động, tôi thực sự sẽ đánh giá cao nó.
Điều này nhanh hơn khóa tùy chỉnh, chẳng hạn như while (otherThread.notReady) {}? Hoặc chậm hơn? –
Tùy chọn 'while (! JobCompleted);' thường là một ý tưởng tồi vì nó liên kết CPU của bạn ở mức 100% kiểm tra cùng một biến liên tục (xem [ở đây] (http://stackoverflow.com/a/1676030/57508)) –
'while (! JobCompleted) Thread.sleep (5); 'không có vấn đề đó – BeniBela