私はここで何をしようとしていますか?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ブロックでロックを解除します。
しかし、私のシナリオでは、私は例外を取得し、
私が行方不明ですどこで、私は間違って
'try {'の前にロックを取得するという慣習に従うべきです。 'lock()'のために例外がスローされた場合、finallyのロックが解除されても例外がスローされます。 –
なぜBフラグが必要ですか? どの行で例外が発生しますか? - > StackTrace – user1025189