0
我已經使用ReentrantLock和條件實施了生產者 - 消費者程序。如果我首先啓動生產者線程,我的實現運行沒有任何錯誤。但是,如果我首先啓動Consumer線程,則會收到IllegalMonitorStateException。請指出我的程序有什麼問題。生產者 - 消費者使用鎖和條件問題
這是我的實現。
public class ProducerConsumerReentrantLock {
public static void main(String[] args) throws InterruptedException {
List<Integer> list = new ArrayList<Integer>(10);
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
int limit=10;
ProductionTaskReentrantLock produce = new ProductionTaskReentrantLock(lock, condition, limit, list);
ConsumptionTaskReentrantLock consume = new ConsumptionTaskReentrantLock(lock, condition, limit, list);
Thread productionWorker = new Thread(produce,"Producer");
Thread consumptionWorker = new Thread(consume,"Consumer");
consumptionWorker.start();
productionWorker.start();
// consumptionWorker.start();
productionWorker.join();
consumptionWorker.join();
}
}
。
class ProductionTaskReentrantLock implements Runnable{
List<Integer> list = null;
ReentrantLock lock;
Condition condition;
int limit;
public ProductionTaskReentrantLock(ReentrantLock lock, Condition condition, int limit, List<Integer> list) {
super();
this.lock = lock;
this.condition = condition;
this.limit = limit;
this.list = list;
}
@Override
public void run() {
lock.lock();
try{
for (int i = 0; i < 10 ; i++) {
while(list.size()==limit){
try {
System.out.println("List is full");
condition.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Produced "+i);
list.add(i);
System.out.println(list);
condition.signalAll();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
lock.unlock();
}
}
}
。
class ConsumptionTaskReentrantLock implements Runnable{
List<Integer> list = null;
ReentrantLock lock;
Condition condition;
int limit;
public ConsumptionTaskReentrantLock(ReentrantLock lock, Condition condition, int limit, List<Integer> list) {
super();
this.lock = lock;
this.condition = condition;
this.limit = limit;
this.list = list;
}
@Override
public void run() {
lock.lock();
try{
for (int i = 0; i < 10 ; i++) {
while(list.isEmpty()){
try {
System.out.println("List is empty");
condition.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Consumed "+list.remove(0));
System.out.println(list);
condition.signalAll();
}
} finally {
lock.unlock();
}
}
}
拋出:IllegalMonitorStateException - 投擲到。表明一個線程試圖等待一個對象的監視器或通知其他線程等待對象的監視器而不擁有指定的監視器。 – mcraen
我不太瞭解Java線程以快速找出錯誤,但這是一個相當具有描述性的錯誤消息 – mcraen
您可以嘗試使用condition.await()而不是等待並查看是否可以解決此問題? – Kamal