2014-10-16 3 views
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

но через выход я»получаю это:

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 
[...] 

я могу понять выброшенное исключение, но почему матрица не отображается полностью?

ответ

2

Почему вы не используете для этого AtomicInteger. Они могут быть безопасно доступны и обработаны из нескольких потоков без необходимости блокировки.

Если вы представляете свой код как между строками, начинающимися с //, вы можете видеть, что NullPointerException будет поймать и обработать, когда блокировка установлена ​​на место, но если будет создано какое-либо другое исключение, в этом блоке исключение будет прогрессировать до трассировки стека до тех пор, пока не будет обнаружено, и когда он будет пойман, вы заблокируете его долгое время.

try { 

    // start of your code 
    lock.lock(); 
    try { 
    doStuff(); 
    } catch(InterruptedException e) { 
    System.out.println("in lock"); 
    } finally { 
    lock.unlock(); 
    } 

    // end of your code 

} catch(Exception e) { // IllegalMonitorStateException caught here 
    System.out.println("not in lock"); 
} 
+0

спасибо за ответ, я попробую это. Но можете ли вы объяснить мне, почему потоки прерывают печать? –

+0

Это исключение, похоже, было захвачено обработчиком неперехваченных исключений, а не обработчиком исключения в вашем блоке кода. Таким образом, блокировка будет выпущена вашим блоком finally до – PeterK

+0

, это не исключение nullPointException, но IllegalMonitorStateException, и если вы увидите, что блокировка и разблокировка находятся внутри блока try-catch-finally. –

Смежные вопросы