生产者消费者模型

生产者消费者模型是一个非常经典的多线程协作的模型,一个消费者,一个生产者。生产者生成的数据可以被两者都看到,是一个共享数据。生产者只需要生产数据,消费者只需要消费数据,两者之间相互解耦不需要关心对方的存在。有一个数据共享区域,当生产者生产数据超过共享区域大小的时候要阻塞,让生产者不要生产,消费者消费。当数据区域为空时,消费者线程阻塞。共享数据区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;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值