2013-07-23 89 views
0

为什么以下非常简单的代码无法正常工作..它卡住了.. 我试图使用显式锁定java.util.concurrent.locks.ReentrantLock;及其newCondition()方法。可重入锁定等待和信号所有方法

这里是我的代码:

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。然后,在一秒钟之后,您在主线程中调用incrementVariable,这自然会挂在方法await上,从不接收信号。

+0

即将回复自己heeh yep没有Thread.sleep(10000)正常工作。 – Rollerball