я пытаюсь сделать здесь общий ресурс, то есть SharedResource777.java, этот класс имеет два метода doIt () и setBFlag (), оба потока получают Lock и выполняют метод, используя поток.
код такой, как показано ниже,
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();
}
}
Здесь происходит следующее: в командной строке первая строка - «THREAD TROY», вторая строка - "java.lang.IllegalMonitorStateException", третья строка - «THREAD HECTOR [true]»,
, и программа завершается.
Я пытался сделать то, что поток T1 выполнит doIt (), который, в свою очередь, получит блокировку, затем войдет в цикл while, распечатает ожидание SOP, которое освободит блокировку.
После того, как поток t2 получает блокировку в методах setBFlag () и signal (), т.е. уведомляет () другому потоку о том, что он снял блокировку,
t1 снова получит блокировку и из-за изменения флага прерывает это время. цикл, снимает блокировку в блоке finally.
Но в моем сценарии я получаю исключение,
Не могли бы вы сказать мне, где я пропал,
Где я ошибаюсь