java解决生产者消费者问题
时间: 2023-10-11 17:27:20 浏览: 111
生产者消费者问题是一个典型的多线程同步问题,Java中可以使用wait()、notify()、notifyAll()和Lock接口等方式来解决。
其中,wait()和notify()是Object类中的方法,可以用于任何对象的同步锁上,而notifyAll()只能用于同一对象上等待的多个线程。使用这些方法需要满足以下条件:
1. 必须在同步方法或同步块中使用。
2. 如果一个线程执行了wait()方法,它会释放锁并进入等待状态,直到有其他线程调用notify()或notifyAll()方法唤醒它。
3. 如果多个线程在同一对象上等待,则只有一个线程会被唤醒。
4. notify()方法只会唤醒一个等待线程,而notifyAll()会唤醒所有等待线程。
下面是一个简单的Java代码实现生产者消费者问题:
```java
public class ProducerConsumer {
private Queue<Integer> queue = new LinkedList<>();
private final int CAPACITY = 5;
public void produce() throws InterruptedException {
int value = 0;
while (true) {
synchronized (this) {
while (queue.size() == CAPACITY) {
wait();
}
System.out.println("Producer produced-" + value);
queue.offer(value++);
notify();
Thread.sleep(1000);
}
}
}
public void consume() throws InterruptedException {
while (true) {
synchronized (this) {
while (queue.isEmpty()) {
wait();
}
int val = queue.poll();
System.out.println("Consumer consumed-" + val);
notify();
Thread.sleep(1000);
}
}
}
}
```
在这个例子中,我们使用了一个队列来存储生产者生产的元素,如果队列已满则生产者线程等待,如果队列为空则消费者线程等待。当一个元素被生产或消费时,需要唤醒等待线程。
需要注意的是,在使用wait()、notify()和notifyAll()方法时,必须在同步方法或同步块中使用。另外,为了避免死锁和饥饿问题,可以使用Lock接口来进行更加灵活的同步控制。
阅读全文