生产者消费者模型是一个非常经典的多线程协作的模型,一个消费者,一个生产者。生产者生成的数据可以被两者都看到,是一个共享数据。生产者只需要生产数据,消费者只需要消费数据,两者之间相互解耦不需要关心对方的存在。有一个数据共享区域,当生产者生产数据超过共享区域大小的时候要阻塞,让生产者不要生产,消费者消费。当数据区域为空时,消费者线程阻塞。共享数据区source负责线程之间的通信(即什么时候该生产,什么时候该通信)。
package thread;
import java.util.LinkedList;
import java.util.Queue;
public class ProduderAndConsumerDemo {
public static void main(String[] args) {
Source source = new Source();
Consumer consumer = new Consumer(source);
Producer producer = new Producer(source);
producer.start();
consumer.start();
}
}
class Producer extends Thread{
private Source source;
public Producer(Source source){
this.source = source;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
source.add(i);
System.out.println("生产者生产"+i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
private Source source;
public Consumer(Source source){
this.source = source;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
int val = 0;
try {
val = source.poll();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者1消费"+val);
}
}
}
/*
* 数据共享区
* */
class Source{
private Queue<Integer> queue = new LinkedList<>();
private int size = 5;
public synchronized void add(int val) throws InterruptedException {
if(queue.size()>size){
wait();//阻塞消费者,不让其继续生产
}
queue.add(val);
notify();//通知消费者,消费数据
}
public synchronized int poll() throws InterruptedException {
if(queue.size()==0){
wait();//没有,消费者线程阻塞,通知生产者继续生产
}
Integer val = queue.poll();
notify();//消费者拿出后,数据坑定不满,通知生产者生产
return val;
}
}