Я хочу увеличить +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
но через выход я»получаю это:
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
[...]
я могу понять выброшенное исключение, но почему матрица не отображается полностью?
спасибо за ответ, я попробую это. Но можете ли вы объяснить мне, почему потоки прерывают печать? –
Это исключение, похоже, было захвачено обработчиком неперехваченных исключений, а не обработчиком исключения в вашем блоке кода. Таким образом, блокировка будет выпущена вашим блоком finally до – PeterK
, это не исключение nullPointException, но IllegalMonitorStateException, и если вы увидите, что блокировка и разблокировка находятся внутри блока try-catch-finally. –