1
我想使用線程增加一行矩陣中的數字+1。當線程訪問時,矩陣不能很好地打印
- 兩個線程不能同時
- 兩個紗線可以在同一時間
我寫訪問不同排在同一行訪問的是(只有共享資源的方法):
public void increaseRow(Integer row) {
if (!mapForRow.containsKey(row))
mapForRow.put(row, "not increased");
if (mapForRow.get(row).equals("not increased")) {
lock.lock();
try {
while (rowIncreased) {
condition.await();
}
mapForRow.get(row).equals("increased");
rowIncreased = true;
for (int j = 0; j < matrix.length; j++)
setMatrix(row, j, matrix[row][j] + 1);
rowIncreased = false;
// replace the value
mapForRow.get(row).equals(" not increased");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println();
System.out.println("begin print matrix");
for (int i = 0; i < row; i++) {
System.out.println();
for (int j = 0; j < column; j++)
System.out.print(matrix[i][j]);
}
System.out.println();
System.out.println("end print matrix ");
System.out.println();
lock.unlock();
condition.notifyAll();
}
}
}
矩陣被初始化爲10行10列,開始線程也是10
而是通過輸出I」 M得到這個:
begin print matrix
0000000000
0000000000
0000000000
0000000000
end print matrix
begin print matrix
00Exception in thread "Thread-0" 00000000
0000000000
0000000000
end print matrix
java.lang.IllegalMonitorStateException
[...]
我能理解拋出的異常,但爲什麼矩陣沒有完全顯示?
謝謝你的回答,我會試試看。但是,你能解釋一下爲什麼線程中斷他們的打印? – 2014-10-16 10:34:42
該異常似乎被未捕獲的異常處理程序捕獲,而不是由您的代碼塊中的異常處理程序捕獲。因此,當你的finally鎖被 – PeterK 2014-10-16 10:37:09
鎖釋放時,它不是nullPointException,而是IllegalMonitorStateException,如果你看到鎖和解鎖在try-catch-finally塊中。 – 2014-10-16 11:35:04