java实现生产者与消费者

生产者与消费者模式是一种经典同步案例
下面我用代码来描述一下这个同步该如何实现
实现基于lock+Condition 模式

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//基于条件监听机制的生产者与消费者
public class CPTest2 {
   public static void main(String[] args) {
       //创建一个线程池
       ExecutorService es=Executors.newFixedThreadPool(10);
       //创建一个锁
       final Lock  lock=new ReentrantLock();
       //创建一个仓库为空的条件
       final Condition empty=lock.newCondition();
       //创建一个仓库已满的条件
       final Condition full=lock.newCondition();
       //创建一个仓库
       final List<Integer> list=new ArrayList<Integer>();
       //开启5个消费者线程
       for(int i=0;i<5;i++){
           es.execute(new Runnable(){

            @Override
            public void run() {
                while(!Thread.interrupted()){
                lock.lock();
                try{
                //当仓库为空时,消费者线程等待
                 if(list.size()==0){

                     try {
                         System.out.println("仓库已空,等待生产者生产");
                         //等待生产者进行生产
                        full.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                 }else{
                     //消费货物
                     list.remove(0);
               System.out.println(Thread.currentThread().getId()+"消费了一个货物");
              //通知所有等待的生产者线程
                     empty.signalAll();

                 }

               }finally{
               //释放对象
                   lock.unlock();
                   try {

                       //将cpu 调度权让给其他消费者线程
                        Thread.yield();
                    //消费线程睡眠0.1秒 ,生产者线程睡眠1秒,说明消费速度大于生产速度,会产生仓库已空提示
                        //Thread.sleep(100);
                      //消费者线程休眠1秒,生产者线程休眠0.1秒,说明生产速度大于消费速度,会产生仓库已满提示
                          Thread.sleep(1000);
                         //消费者与生产者休眠时间一样
                          // Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    }
                }

            }


           });

       }
       //开启5个生产者线程
       for(int i=0;i<5;i++){
           es.execute(new Runnable(){

            @Override
            public void run() {
                while(!Thread.interrupted()){
                //获得该类对象锁
                lock.lock();
                try{
                //仓库的容量为100 
                 if(list.size()==100){
                     try {
                  System.out.println("仓库已满等待消费者消费");
                  //等待消费者消费
                        empty.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                 }else{
                 //添加货物
                     list.add(23);
                     System.out.println(Thread.currentThread().getId()+"生产了一个货物");
                     //通知所有的消费者线程,进行消费
                     full.signalAll();

                 }

               }finally{
               //释放锁
                   lock.unlock();
                   try {
                       //将cpu 调度权让给其他生产者线程
                        Thread.yield();
                //消费线程睡眠0.1秒 ,生产者线程睡眠1秒,说明消费速度大于生产速度,会产生仓库已空提示
                        //Thread.sleep(1000);
                 //消费者线程休眠1秒,生产者线程休眠0.1秒,说明生产速度大于消费速度,会产生仓库已满提示
                       Thread.sleep(100);
                 //消费者与生产者休眠时间一样
                      // Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    }
                }

            }


           });

       }
   }
}   

实现效果自己测试。
你可以调节仓库的容量
你可以调节消费者和生产者的数量
你可以调节消费者消费的时间和生产者生产的时间
代码自己改,应该挺简单的吧
博客写完了,有没有学会点东西了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值