日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 实现生产者-消费者模式

發布時間:2025/4/16 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 实现生产者-消费者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。