java实现生产者与消费者

xiaoxiao2021-02-28  43

生产者与消费者模式是一种经典同步案例 下面我用代码来描述一下这个同步该如何实现 实现基于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(); } } } } }); } } }

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

转载请注明原文地址: https://www.6miu.com/read-200037.html

最新回复(0)