需要以下链接的代码帮助,因为它应该像任何典型的生产者/消费者问题一样无限期地运行,但是由于某种原因,它在调用condition.signal()时被卡住了。我在这里做什么错了?
在主要方法中,我创建了两个线程,一个是消费者,另一个是生产者。它具有共享的任务队列,两个队列都在其中更新条目。
package com.anurgup.handson;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionService implements Runnable {
Lock lock = new ReentrantLock();
Condition added = lock.newCondition();
Condition removed = lock.newCondition();
// type of service
String type;
// shared task for insertion and deletion of task
static Queue<Integer> task = new PriorityQueue<Integer>();
// max number of task allowed
private static final int MAX_SIZE = 5;
public ConditionService(String type) {
this.type = type;
}
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new ConditionService("producer"));
service.submit(new ConditionService("consumer"));
}
public void produce() {
try {
while (true) {
System.out.println("in producer...");
synchronized (task) {
while (task.size() == MAX_SIZE)
removed.await();
System.out.println("added item: " + task.size());
task.add(task.size());
added.signal();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void consume() {
try {
while (true) {
System.out.println("in consumer...");
synchronized (task) {
while (task.isEmpty())
added.await();
System.out.println("removed item: " + task.peek());
task.remove();
removed.signal();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
if (this.type.equals("producer"))
this.produce();
else
this.consume();
}
}
答案 0 :(得分:1)
您犯了两个错误。首先,您的锁和条件必须是静态的,否则每个任务将仅同步并自行等待。其次,您需要使用lock.lock()
,而不是synchronized
。它应该看起来像这样:
lock.lock();
try {
// wait
// produce/consume
} finally {
lock.unlock();
}