生产者和消费者介绍
生产者和消费者是一个经典的问题,生产者负责生产,生产的东西放入buffer,消费者负责消费,从buffer取东西。关键是如何保证buffer里面不满不空,换句话说就是buffer里有东西就让消费者消费,buffer没有东西就让生产者生产。其实,我们可以通过wait和notify来实现。
生产者和消费者实例
package com.yuxi;
import java.util.LinkedList;
/**
* 生产者和消费者问题
* <p>
* Created by yuxi on 17/2/2.
*/
public class ConsProd {
private static LinkedList buffer = new LinkedList();
private static int size = 10;
public static void main(String[] args) {
Consumer consumer = new Consumer();
Producer produer = new Producer();
new Thread(produer).start();
new Thread(produer).start();
new Thread(produer).start();
new Thread(produer).start();
new Thread(produer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
}
static class Producer implements Runnable {
public void run() {
synchronized (this) {
if (buffer.size() == size) {
this.notify();
} else {
buffer.add("something");
System.out.println("生产者生产了.....");
}
}
}
}
static class Consumer implements Runnable {
public void run() {
synchronized (this) {
if (buffer.isEmpty() || buffer.size() == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
Object o = buffer.removeFirst();
System.out.println("消费者消费了...." + o);
}
}
}
}
}
从这个例子可以看出:
- 1 如果生产者大于消费者,就会出现生产者生产过剩,超出buffer容量,就必须唤醒消费者消费。
- 2 如果消费者大于生产者,就会出现无法消费问题,当buffer没有东西的时候,消费就会停滞。
当然还有其他的写法,这个这是结合wait和notify来实现的,如果了解juc的当然也可以使用,lock和condition来实现生产者和消费者。