java 实现生产者-消费者模式
生活随笔
收集整理的這篇文章主要介紹了
java 实现生产者-消费者模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
生產和消費者模式有很多種,現在介紹幾種常見的方式
- wait/notify實現生產和消費者模式
?
1、使用wait/notify實現生產和消費者模式:
public class Depot {// 實際容量private volatile int capacity = 0 ;// 最大容量private static final int MAX_CAPACITY = 100 ;// 鎖private final Object lock = new Object() ;public Depot(){}/*** 生產* @param: num* @return:*/public void producer(int num) {if(num<0){System.out.println("生產數量不可為負數");throw new IllegalArgumentException("生產數量不可為負數") ;}synchronized (lock){// 生產int left = 0;try {left = doProducer(num);// 要求生產數量未達標,讓出執行權while (left > 0){Thread.yield();left = doProducer(left);}} catch (InterruptedException e) {e.printStackTrace();}lock.notify();}}/*** 實際生產邏輯* @param: num* @return: 返回未生產數量*/private int doProducer(int num) throws InterruptedException {// 實際增加數量int grow = num ;// 未生產數量int left = 0 ;// 等待倉庫被消費while (capacity>=MAX_CAPACITY){lock.wait();}// 計算實際新增數量if( (num+capacity) > MAX_CAPACITY ){grow = MAX_CAPACITY - capacity ;left = num - grow ;}capacity += grow ;// 倉庫已經生產,通知消費者消費 lock.notify();System.out.println(Thread.currentThread().getName() + " Plan Producer = " + num + " Actually = " + grow + " left = " + left + " capacity = " + capacity);return left ;}/*** 消費* @param: num* @return:*/public void consumer(int num) {if(num<0){System.out.println("消費數量不可為負數");throw new IllegalArgumentException("消費數量不可為負數") ;}synchronized (lock){// 消費倉庫int left = 0;try {left = doConsumer(num);// 要求消費數量未達標,讓出執行權while (left > 0){Thread.yield();left = doConsumer(left);}} catch (InterruptedException e) {e.printStackTrace();}// 倉庫已經被消費,通知生產者生產 lock.notify();}}/*** 實際消費邏輯* @param: num* @return: 剩余未消費數量*/private int doConsumer(int num) throws InterruptedException {// 實際消費數量int decrease = num ;// 剩余未消費int left = 0 ;// 等待倉庫生產while (capacity <= 0){lock.wait();}// 計算實際消費數量if(decrease > capacity){decrease = capacity ;left = decrease - capacity ;}capacity -= decrease ;System.out.println(Thread.currentThread().getName() + " Plan Consumer = "+ num + " Actually = " + decrease + " left = " + left + " capacity = " + capacity );return left ;}}?
?
測試案例:
public class ProducerAndConsumer {public static void main(String[] args) throws InterruptedException {Depot depot = new Depot() ;for(int x=0 ; x<4; x++){new Thread(new Runnable() {@Override public void run() {depot.producer(40);}}).start();}Thread.sleep(2000L);for(int x=0 ; x<3; x++){new Thread(new Runnable() {@Override public void run() {depot.consumer(40);}}).start();}Thread.sleep(2000L);} }?
?
運行結果:
Thread-0 Plan Producer = 40 Actually = 40 left = 0 capacity = 40 Thread-1 Plan Producer = 40 Actually = 40 left = 0 capacity = 80 Thread-2 Plan Producer = 40 Actually = 20 left = 20 capacity = 100 Thread-4 Plan Consumer = 40 Actually = 40 left = 0 capacity = 60 Thread-2 Plan Producer = 20 Actually = 20 left = 0 capacity = 80 Thread-3 Plan Producer = 40 Actually = 20 left = 20 capacity = 100 Thread-6 Plan Consumer = 40 Actually = 40 left = 0 capacity = 60 Thread-5 Plan Consumer = 40 Actually = 40 left = 0 capacity = 20 Thread-3 Plan Producer = 20 Actually = 20 left = 0 capacity = 40?
其他待續.........
?
轉載于:https://www.cnblogs.com/xiaoxing/p/8556236.html
總結
以上是生活随笔為你收集整理的java 实现生产者-消费者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#多线程编程(6)--线程安全2 互锁
- 下一篇: 洛谷 1379 八数码难题