2013-07-23 6 views
0

Почему следующий очень простой код не работает .. он застрял .. Я пытаюсь использовать явный замок java.util.concurrent.locks.ReentrantLock; и его метод newCondition().Reentrant lock wait и signalAll методы

Вот мой код:

import java.util.concurrent.locks.Condition; 
    import java.util.concurrent.locks.ReentrantLock; 

    public class TheCondition implements Runnable { 

     ReentrantLock lock = new ReentrantLock(); 
     Condition condition = lock.newCondition(); 

     static int variable = 2; 

     public void incrementVariable() throws InterruptedException 
     { 
      lock.lock(); 
      try{  
       condition.await(); 
       for (int i = 0;i<100000;i++){ 
         variable++; 
       } 
      } 
      finally 
      { 
       lock.unlock(); 
      } 
     } 


     public static void main (String []args) throws InterruptedException 
     { 
      TheCondition tc = new TheCondition(); 
      Thread t1 = new Thread(tc); 
      t1.start(); 
      Thread.sleep(1000); 
      tc.incrementVariable(); 
      t1.join(); 
      System.out.println(variable); 
     } 

     public void run() 
     { 
      for (int i = 0;i<100000;i++){ 
       variable++;  
      } 
      System.out.println(variable); 
      lock.lock(); 
      try{ 
       condition.signalAll(); 
      } 
      finally{ 
       lock.unlock(); 
      } 
     } 
    } 

Я замок на том же замке, так что должно работать ... вместо этого он блокируется в основном потоке, когда он вызывает incrementVariable(). Зачем это происходит? Спасибо заранее.

ответ

3

Сначала вы выполните run, который завершается через несколько микросекунд. Этот метод вызывает signalAll в то время, когда нити не равны await. Затем через одну секунду вы вызываете incrementVariable в основной поток, который, естественно, зависает по методу await, никогда не получая сигнал.

+0

Собирался ответить сам heeh yep без Thread.sleep (10000) отлично работает. – Rollerball