实现一个生产者——消费者模型(5种方式)

本文详细介绍了使用synchronized、wait/notify、Lock/Condition、BlockingQueue、Semaphore和Exchanger五种方法实现生产者-消费者模型,分别通过代码示例展示了每种方式的工作原理和应用。
摘要由CSDN通过智能技术生成

用五种方式来实现生产者消费者模型

  1. Object.wait/notify
  2. Lock/Condition
  3. BlockingQueue
  4. Semaphore
  5. Exchanger

方式一:synchronized、wait和notify
创建一个资源类Resource:
public class Resource {
//当前资源量
int num = 0;
//资源池中允许放的资源数目
int size = 10;
//向资源池中取走资源
int i = 0;
public synchronized void remove(){
if (num>0){
num–;
System.out.println(“消费者”+Thread.currentThread().getName()+“减去一个随机数”+i+“当前线程池有”+num+“个”);
notifyAll();//通知生产者生产资源
}else{
try {
//如果没有资源,则消费者进入等待状态
wait();
System.out.println(“消费者”+Thread.currentThread().getName()+“线程进入等待”);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
//向资源池中添加资源
public synchronized void add(){
if(num<size){
num++;
i = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+“加个随机数”+i+“当前资源池还剩”+num+“个”);
//通知等待的消费者
notifyAll();
}else{
//如果有10个随机数
try {
wait();//生产者进入等待状态,并释放锁
System.out.println(Thread.currentThread().getName()+“线程进入等待”);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
实现:
public class ProducerConsumer1 {
public static void main(String[] args) throws InterruptedException {
Resource resource = new Resource();
Producer producer = new Producer(resource);
Consumer consumer = new Consumer(resource);

    producer.start();
    consumer.start();

    producer.join();
    consumer.join();
}
//生产者线程
public static class Producer extends Thread {
    private  Resource resource;
    public Producer(Resource resource){
        this.resource=resource;
    }
    @Override
    public void run() {
        int i = 0;
        int j = 10;
        while (i<j){
            i++;
            try {
            	//休眠1000毫秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resource.add();
        }
    }
}
//消费者线程
public static class Consumer extends Thread {
    private Resource resource;
    public Consumer(Resource resource){
        this.resource = resource;
    }
    @Override
    p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值