2012-02-10 11 views
0

私はここで何をしようとしていますか?SharedResource777.java このクラスにはdoIt()とsetBFlag()スレッドを使用してメソッドをロックして実行します。デッドロックを避けるためにExplicit Lockを使用すると例外が発生します

コードは、以下の通りである

「スレッドTROY」、 第二行は「java.lang.IllegalMonitorStateException」である最初の行をコマンドプロンプトでは、ここに何が起こる
import java.util.concurrent.locks.*; 

    class SharedResource777{ 
     private boolean bFLag = false; 
     private Lock lockObj = new ReentrantLock(); 
     private Condition condition = lockObj.newCondition(); 

     public void doIt() {   
      try{ 
       lockObj.lock();   
       while(!bFLag){ 
        System.out.println(" THE THREAD "+Thread.currentThread().getName());    
        condition.wait(); 
       }   
      }catch(Exception e){ 
       System.out.println(e); 
      }finally{ 
       lockObj.unlock(); 
      }   
     } 

     public void setBFlag(boolean bFLag){   
      try{ 
       lockObj.lock(); 
       this.bFLag = bFLag;  
       System.out.println(" THE THREAD "+Thread.currentThread().getName()+" ["+this.bFLag+"]"); 
       condition.signal(); 
      }catch(Exception e){ 
       System.out.println(e); 
      }finally{ 
       lockObj.unlock(); 
      } 
     } 

    } 

    class MyThread620 extends Thread{ 

     private SharedResource777 resource; 

     MyThread620(String threadName,SharedResource777 resource){ 
      super(threadName); 
      this.resource = resource; 
     } 

     @Override 
     public void run(){ 
      resource.doIt();    
     } 
    } 

    class MyThread621 extends Thread{ 

     private SharedResource777 resource; 

     MyThread621(String threadName,SharedResource777 resource){ 
      super(threadName); 
      this.resource = resource; 
     } 

     @Override 
     public void run(){ 
      resource.setBFlag(true);      
     } 
    } 



    public class Ex11{ 
     public static void main(String [] args){ 
      SharedResource777 obj777 = new SharedResource777(); 
      MyThread620 t620 = new MyThread620("TROY",obj777); 
      MyThread621 t621 = new MyThread621("HECTOR",obj777); 
      t620.start(); 
      t621.start(); 
     } 
    } 

、 三行目"THE THREAD HECTOR [真]"、

であり、プログラムが終了します。

スレッドT1はdoIt()を実行し、whileループに入るよりもロックを取得し、ロックを解除するSOP待機を表示します。スレッドT2より

は、メソッドsetBFlagにおけるロック()、それがロックを解放したことを他のスレッドに、すなわち信号()(通知)、

T1再びロックを取得してあるため、フラグ変化、破断の意志を取得します。 whileループはfinallyブロックでロックを解除します。

しかし、私のシナリオでは、私は例外を取得し、

私が行方不明ですどこで、私は間違って

+0

'try {'の前にロックを取得するという慣習に従うべきです。 'lock()'のために例外がスローされた場合、finallyのロックが解除されても例外がスローされます。 –

+0

なぜBフラグが必要ですか? どの行で例外が発生しますか? - > StackTrace – user1025189

答えて

0

wait()/notify()メソッドを呼び出すときに固有のオブジェクトのロックを保持する必要がありますつもりです

を教えてくださいことができます。あなたはcondition.wait()であり、condition.await()ではありません。これはあなたのIllegalMonitorState例外の理由です。

関連する問題