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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

生产者消费者问题Java三种实现

發布時間:2025/3/19 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者消费者问题Java三种实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

生產者-消費者Java實現

2017-07-27

1 概述


?

生產者消費者問題是多線程的一個經典問題,它描述是有一塊緩沖區作為倉庫,生產者可以將產品放入倉庫,消費者則可以從倉庫中取走產品。

解決生產者/消費者問題的方法可分為兩類:

  • 采用某種機制保護生產者和消費者之間的同步;
  • 在生產者和消費者之間建立一個管道。

第一種方式有較高的效率,并且易于實現,代碼的可控制性較好,屬于常用的模式。第二種管道緩沖區不易控制,被傳輸數據對象不易于封裝等,實用性不強。

在Java中有四種方法支持同步,其中前三個是同步方法,一個是管道方法。

  • wait() / notify()方法
  • await() / signal()方法
  • BlockingQueue阻塞隊列方法
  • PipedInputStream / PipedOutputStream

本文只介紹前三種。

2 實現


?

2.1 wait() / notify()方法

wait() / nofity()方法是基類Object的兩個方法:

  • wait()方法:當緩沖區已滿/空時,生產者/消費者線程停止自己的執行,放棄鎖,使自己處于等等狀態,讓其他線程執行。
  • notify()方法:當生產者/消費者向緩沖區放入/取出一個產品時,向其他等待的線程發出可執行的通知,同時放棄鎖,使自己處于等待狀態。

緩沖區Storage.java代碼如下:

import java.util.LinkedList;public class Storage {// 倉庫最大存儲量private final int MAX_SIZE = 100;// 倉庫存儲的載體private LinkedList<Object> list = new LinkedList<Object>();// 生產產品public void produce(String producer){synchronized (list){// 如果倉庫已滿while (list.size() == MAX_SIZE){System.out.println("倉庫已滿,【"+producer+"】: 暫時不能執行生產任務!");try{// 由于條件不滿足,生產阻塞 list.wait();}catch (InterruptedException e){e.printStackTrace();}}// 生產產品 list.add(new Object()); System.out.println("【"+producer+"】:生產了一個產品\t【現倉儲量為】:" + list.size());list.notifyAll();}}// 消費產品public void consume(String consumer){synchronized (list){//如果倉庫存儲量不足while (list.size()==0){System.out.println("倉庫已空,【"+consumer+"】: 暫時不能執行消費任務!");try{// 由于條件不滿足,消費阻塞 list.wait();}catch (InterruptedException e){e.printStackTrace();}}list.remove();System.out.println("【"+consumer+"】:消費了一個產品\t【現倉儲量為】:" + list.size());list.notifyAll();}}public LinkedList<Object> getList(){return list;}public void setList(LinkedList<Object> list){this.list = list;}public int getMAX_SIZE(){return MAX_SIZE;} } View Code

Test.java

public class Test {public static void main(String[] args){Storage storage=new Storage();for(int i=1;i<6;i++){int finalI = i;new Thread(new Runnable() {@Overridepublic void run() {storage.produce(String.format("生成者%d:", finalI));}}).start();}for(int i=1;i<4;i++){int finalI = i;new Thread(()-> storage.consume(String.format("消費者%d:", finalI))).start();}} } View Code

結果如下:

倉庫已空,【消費者1】: 暫時不能執行消費任務! 【生產者3】:生產了一個產品 【現倉儲量為】:1 【消費者2】:消費了一個產品 【現倉儲量為】:0 倉庫已空,【消費者3】: 暫時不能執行消費任務! 【生產者1】:生產了一個產品 【現倉儲量為】:1 【生產者4】:生產了一個產品 【現倉儲量為】:2 【生產者2】:生產了一個產品 【現倉儲量為】:3 【生產者5】:生產了一個產品 【現倉儲量為】:4 【消費者1】:消費了一個產品 【現倉儲量為】:3 【消費者3】:消費了一個產品 【現倉儲量為】:2

2.2 await() / signal()方法

await()和signal()的功能基本上和wait() / nofity()相同,完全可以取代它們,但是它們和新引入的鎖定機制Lock直接掛鉤,具有更大的靈活性。通過在Lock對象上調用newCondition()方法,將條件變量和一個鎖對象進行綁定,進而控制并發程序訪問競爭資源的安全。

緩沖區Storage.java代碼如下:

import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class Storage {// 倉庫最大存儲量private final int MAX_SIZE = 100;// 倉庫存儲的載體private LinkedList<Object> list = new LinkedList<Object>();//private final Lock lock = new ReentrantLock();// 倉庫滿的條件變量private final Condition full = lock.newCondition();// 倉庫空的條件變量private final Condition empty = lock.newCondition();// 生產產品public void produce(String producer) {lock.lock();// 如果倉庫已滿while (list.size() == MAX_SIZE) {System.out.println("倉庫已滿,【" + producer + "】: 暫時不能執行生產任務!");try {// 由于條件不滿足,生產阻塞 full.await();} catch (InterruptedException e) {e.printStackTrace();}}// 生產產品list.add(new Object());System.out.println("【" + producer + "】:生產了一個產品\t【現倉儲量為】:" + list.size());empty.signalAll();// 釋放鎖 lock.unlock();}// 消費產品public void consume(String consumer) {// 獲得鎖 lock.lock();// 如果倉庫存儲量不足while (list.size() == 0) {System.out.println("倉庫已空,【" + consumer + "】: 暫時不能執行消費任務!");try {// 由于條件不滿足,消費阻塞 empty.await();} catch (InterruptedException e) {e.printStackTrace();}}list.remove();System.out.println("【" + consumer + "】:消費了一個產品\t【現倉儲量為】:" + list.size());full.signalAll();// 釋放鎖 lock.unlock();}public LinkedList<Object> getList() {return list;}public void setList(LinkedList<Object> list) {this.list = list;}public int getMAX_SIZE() {return MAX_SIZE;} } View Code

2.3 BlockingQueue

它是一個已經在內部實現了同步的隊列,實現方式采用的是我們第2種await() / signal()方法。它可以在生成對象時指定容量大小。它用于阻塞操作的是put()和take()方法:

put()方法:類似于我們上面的生產者線程,容量達到最大時,自動阻塞。

take()方法:類似于我們上面的消費者線程,容量為0時,自動阻塞。

import java.util.concurrent.LinkedBlockingQueue;public class Storage {// 倉庫最大存儲量private final int MAX_SIZE = 100;// 倉庫存儲的載體private LinkedBlockingQueue<Object> list = new LinkedBlockingQueue<Object>(100); // 生產產品public void produce(String producer) {// 如果倉庫已滿if (list.size() == MAX_SIZE) {System.out.println("倉庫已滿,【" + producer + "】: 暫時不能執行生產任務!"); }// 生產產品try {list.put(new Object());} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println("【" + producer + "】:生產了一個產品\t【現倉儲量為】:" + list.size());}// 消費產品public void consume(String consumer) {// 如果倉庫存儲量不足if (list.size() == 0) {System.out.println("倉庫已空,【" + consumer + "】: 暫時不能執行消費任務!"); }try {list.take();} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println("【" + consumer + "】:消費了一個產品\t【現倉儲量為】:" + list.size()); }public LinkedBlockingQueue<Object> getList() {return list;}public void setList(LinkedBlockingQueue<Object> list) {this.list = list;}public int getMAX_SIZE() {return MAX_SIZE;} } View Code

?

轉載于:https://www.cnblogs.com/Ming8006/p/7243858.html

總結

以上是生活随笔為你收集整理的生产者消费者问题Java三种实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91波多野结衣 | 西野翔夫の目の前で犯在线 | 国产成人手机视频 | av男人网| 乱xxxxx普通话对白 | 日韩av毛片在线观看 | 香蕉在线看 | 香蕉狠狠爱视频 | 国产69精品久久久久999小说 | 中文字幕一区在线观看 | 一级做a爰片 | 欧美视频在线观看免费 | 成人免费大片黄在线播放 | 波多野结衣中文字幕在线 | 五月婷在线 | 啪啪激情网 | 久久精品99国产 | 51精产品一区一区三区 | 无码一区二区三区在线观看 | 黑人添美女bbb添高潮了 | 午夜国产福利视频 | av成人在线电影 | 天天摸日日摸 | 合欢视频污| 日韩av免费在线观看 | www天天操 | 天天毛片| 国产精品91久久 | 毛片网站在线看 | 性色视频| 国产成人免费av | 华丽的外出在线观看 | 久国产 | 色天天色综合 | 少妇熟女一区二区 | 四虎黄色网 | 91久久精品一区 | 国产美女精品视频国产 | 高清在线一区二区三区 | 久久久精品一区二区涩爱 | 国产一区二区三区18 | 精品人妻无码一区二区三区 | 超碰免费91 | 黄色片的网站 | 亚洲综合av网| 日韩www| 国产粉嫩在线 | 涩涩综合| 自拍偷拍第二页 | 国产精品不卡av | 波多野结衣免费看 | 亚洲图片一区二区 | 亚洲av永久无码精品一百度影院 | 亚洲成av人片在线观看无 | 亚洲激情网址 | 中文字幕123 | 黑人操亚洲人 | 精品一卡二卡 | 18成人免费观看网站下载 | 观看av免费 | 中文字幕一区二区三区又粗 | 一区二区三区四区精品 | 久久久免费精品视频 | 亚洲狼人综合网 | 天天爱天天做 | 青青草国产在线视频 | 中文字幕人妻一区 | 亚洲婷婷在线观看 | 免费看a级黄色片 | 久久久久久视 | 视频一区二区三区精品 | 精品国产乱码久久久久久1区二区 | www.色就是色.com | 大尺度摸揉捏胸床戏视频 | 久久国产人妻一区二区免色戒电影 | 免费无码av片在线观看 | 成人综合社区 | 欧美一区二区三区电影 | 色婷婷视频在线 | 黑人欧美一区二区三区 | 毛片无码免费无码播放 | 青青草www | 欧美人妖69xxxxxhd3d | 亚洲第一在线视频 | 我我色综合 | 在线播放第一页 | 91综合久久| 91视频合集 | 国产美女av在线 | 欧美成人吸奶水做爰 | 精品视频久久久久 | 成年人视频网站 | 夜夜嗨网站| 九九热精品在线观看 | 伊人一二三 | 成年人免费在线看 | 欧美男人又粗又长又大 | 亚洲视频1 | 人妻精品一区二区三区 |