六種方式實現生產者消費者(未完)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、利用Object對象是wait和notify\notifyAll

? ??

package com.jv.parallel.consumerandproducer.objectwait;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已經被消費");}public void showProducer(){System.out.println("I am a Car ! 我已經被生產");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}

?

package com.jv.parallel.consumerandproducer.objectwait;public class Consumer extends Thread{private Car car;public Consumer() {// TODO Auto-generated constructor stub}public Consumer(Car car){this.car = car;}@Overridepublic void run() {while(true){synchronized(car){try {while(car.getFlag()==0){car.wait();}car.setFlag(0);car.showConsumer();car.notifyAll();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

?

package com.jv.parallel.consumerandproducer.objectwait;public class Producer extends Thread{private Car car;public Producer(){}public Producer(Car car){this.car = car;}public void run() {while(true){synchronized(car){try {while(car.getFlag()==1){car.wait();}car.setFlag(1);car.showProducer();car.notifyAll();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

?

package com.jv.parallel.consumerandproducer.objectwait;public class Test {public static void main(String[] args) {Car car  = new Car();Consumer cs = new Consumer(car);Producer pd = new Producer(car);cs.start();pd.start();}
}

?

二、使用Lock.Condition

? ??

package com.jv.parallel.consumerandproducer.lock;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已經被消費");}public void showProducer(){System.out.println("I am a Car ! 我已經被生產");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}
package com.jv.parallel.consumerandproducer.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class Consumer implements Runnable{private Car car;private Lock lock;private Condition cd ;public Consumer() {// TODO Auto-generated constructor stub}public Consumer(Car car,Lock lock,Condition cd){this.car=car;this.lock=lock;this.cd=cd;}@Overridepublic void run() {while(true){lock.lock();try{while(car.getFlag()==0){cd.await();}car.setFlag(0);car.showConsumer();cd.signal();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();}}}
}
package com.jv.parallel.consumerandproducer.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class Producer implements Runnable{private Car car;private Lock lock;private Condition cd ;public Producer() {// TODO Auto-generated constructor stub}public Producer(Car car,Lock lock,Condition cd){this.car=car;this.lock=lock;this.cd=cd;}@Overridepublic void run() {while(true){lock.lock();try{while(car.getFlag()==1){cd.await();}car.setFlag(1);car.showProducer();cd.signal();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}finally{lock.unlock();}}}
}
package com.jv.parallel.consumerandproducer.lock;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) {Lock lock = new ReentrantLock();Car car = new Car();Condition cd = lock.newCondition();Thread t1 = new Thread(new Consumer(car,lock,cd));Thread t2 = new Thread(new Producer(car,lock,cd));t1.start();t2.start();}
}

?

三、使用阻塞隊列

設置阻塞隊列長度為1,使用put和take方法(可阻塞)

package com.jv.consumerandproducer.queue;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class TestQueue {	public static void main(String[] args) {BlockingQueue<Car> queue = new ArrayBlockingQueue<Car>(1);Consumer c = new Consumer(queue);Producer p = new Producer(queue);Thread t1 = new Thread(c);Thread t2 = new Thread(p);t1.start();t2.start();System.out.println("main haved end");}}
class Consumer implements Runnable{BlockingQueue<Car> queue;public Consumer(BlockingQueue<Car> queue){this.queue=queue;}@Overridepublic void run() {Car c ;while(true){try {c = queue.take();c.showConsumer();Thread.currentThread().sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}class Producer implements Runnable{BlockingQueue<Car> queue;public Producer(BlockingQueue<Car> queue){this.queue=queue;}@Overridepublic void run() {Car c ;while(true){try{c = new Car();queue.put(c);c.showProducer();Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}}}}
package com.jv.consumerandproducer.queue;public class Car {private volatile int flag = 0;public void showConsumer(){System.out.println("I am a Car ! 我已經被消費");}public void showProducer(){System.out.println("I am a Car ! 我已經被生產");}public int getFlag(){return flag;}public void setFlag(int flag){this.flag=flag;}
}

四、利用FutureTask實現

? ? 還需要研究它的內部實現原理

? ? 代碼待補充

五、使用信號量實現

????其內部原理還是利用被包裝過的同步器的condition對象實現

? ? 代碼待補充

六、使用Redis列表數據類型實現

? ? 因為它具有可阻塞特性。

? ? 代碼待補充

轉載于:https://my.oschina.net/u/3049601/blog/912986

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456341.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456341.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456341.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL中基于代價的優化

還記得筆者在上篇文章無意中挖的一個坑么&#xff1f;如若不知&#xff0c;強烈建議看官先行閱讀前面兩文&#xff0d;《SparkSQL Join原理》和《Join中竟然也有謂詞下推?》 第一篇文章主要分析了大數據領域Join的三種基礎算法以及各自的適用場景&#xff0c;第二篇文章在第一…

git如何解決沖突(代碼托管在coding)

分支A提交合并請求到分支B&#xff0c;有沖突git fetch code 拉取遠程倉庫的其他分支代碼&#xff08;我拉代碼是remote add code所以這里是code,可以用git remote查看&#xff09;git checkout 分支A 切換到分支Agit pull code 分支A 拉取分支A代碼git checkout 分支B 切換到分…

cookie和session之會話機制: ? http 協議? ---》 無狀態協議

設置cookie&#xff1a; 通過response對象&#xff1a; response make_response() response.set_cookie(key,value,max_age(單位second),expires(要求是detetime類型)) expires datetime(year2018,month11,day5) #expires是這么設置的 expires datetime.n…

Java Map 怎樣實現Key 的唯一性?

大家都知道。在Map和Set不可存在反復元素&#xff1f; 可是對于內部的細節我們并不了解。今天我們就一塊來 探討一下&#xff01; 1 對于 HashMap HashSet 他們的底層數據結構的實現是&#xff1a;維護了一張 HashTable 。容器中的元素所有存儲在Hashtable 中。他們再加入…

win10下安裝pyspark及碰到的問題

文章目錄前言安裝過程Q1總結&#xff1a;前言 最近由于工作需要&#xff0c;需要了解下pyspark&#xff0c;所以就在win10環境下裝了下&#xff0c;然后在pycharm中使用的時候碰到了一些問題。整個過程可謂是一波三折。下面一一道來。 安裝過程 安裝過程就不詳細說了&#x…

解決AttributeError AttributeError: 'NoneType' object has no attribute 'filename'

原因忘記上傳文件 表單需要加屬性 enctype"multipart/form-data" 否則報錯&#xff01;AttributeError AttributeError: NoneType object has no attribute filename enctype"multipart/form-data是設置表單的MIME編碼。默認情況&#xff0c;這個編碼格式是ap…

SQLAlchemy()分頁器paginate方法

Flask的數據分頁示例 用法&#xff1a; 1&#xff0c;首先寫數據獲取的視圖函數&#xff0c;就像這樣&#xff1a; # 首頁 blog_bp.route(/, endpointindex) def index():#獲取頁數page request.args.get(page,1)paginate Article.query.paginate(pageint(page),per_page3)…

開源中國 2014 年源創會年度計劃

時光總是從敲代碼的指尖不經意地滑過&#xff0c;轉眼2014年已快過去一半&#xff0c;OSC依然心懷著最初的夢想。 源創會&#xff0c;oscer的線下快樂大本營&#xff0c;我們仍在繼續...... 聆聽技術大牛講解最前沿的技術&#xff0c;和同道中人切磋IT秘籍&#xff0c;吃點心侃…

互聯網金融行業申請評分卡(A卡)簡介

文章目錄前言基本概念1、信用違約風險的基本概念什么是信用違約風險&#xff1a;組成部分違約的主體個貸中常用的違約定義M0&#xff0c;M1&#xff0c;M2的定義2、申請評分卡的重要性和特性信貸場景中的評分卡申請評分卡的概念為什么要開發申請評分卡評分卡的特性 &#xff08…

Flask的csrf_token的用法

在flask當中&#xff0c;flask-wtf模塊時攜帶csrf校驗的&#xff0c;只是需要開啟&#xff1b; 如果不開啟校驗就不需要校驗&#xff0c;但是那樣不安全。 Csrf是針對與post請求的跨域限制&#xff0c;get請求沒有作用 csrf_token的開啟 在flask中開啟csrf保護 from flask_…

dotty編譯器語法特性之一交叉類型,聯合類型和文本單例類型

2019獨角獸企業重金招聘Python工程師標準>>> ###翻譯&#xff1a;http://dotty.epfl.ch/docs/reference/intersection-types.html #交叉類型 trait Resettable {def reset(): this.type } trait Growable[T] {def add(x: T): this.type } def f(x: Resettable &…

【轉】Zookeeper 安裝和配置

轉自&#xff1a;http://coolxing.iteye.com/blog/1871009 Zookeeper的安裝和配置十分簡單, 既可以配置成單機模式, 也可以配置成集群模式. 下面將分別進行介紹. 單機模式 1. 配置 點擊這里下載zookeeper的安裝包之后, 解壓到合適目錄. 進入zookeeper目錄下的conf子目錄, 創建z…

一分鐘精通Flask-Bootstrap的使用

要想在程序中集成Bootstrap&#xff0c;顯然要對模板做所有必要的改動。不過&#xff0c;更簡單的方法是使用一個名為Flask-Bootstrap 的Flask 擴展&#xff0c;簡化集成的過程。 安裝&#xff1a; Flask-Bootstrap 使用pip安裝&#xff1a; pip install flask_bootstrap Fl…

linux生產環境下安裝anaconda總結

前言&#xff1a; 工作中&#xff0c;常常要在新的linux生產服務器中安裝自己的集成python環境&#xff0c;這種情況下有一點需要注意&#xff1a;不能覆蓋生產服務器中的python環境&#xff08;也就是自己的python環境要和系統的python環境分開&#xff09;。一般情況下系統自…

Delphi TScrollBar 用于滾動窗口、組件內容

滾動條組件&#xff08;TScrollBar&#xff09;此組件是一個Windows滾動條&#xff0c;用于滾動窗口、組件內容。許多控制有滾動條屬性&#xff0c;它們把滾動條作為自己的一部分&#xff0c;對于沒有完整滾動條的控制&#xff0c;TScrollBar組件提供了一個附加的功能&#xff…

FSF 稱 DRM 被用于鎖定、控制和監視用戶

自由軟件基金會正在督促美國政府廢除DMCA中保護DRM的反規避條款。DMCA的1201條款禁止繞過DRM保護的內容和設備。 自由軟件基金會的Donald Robertson在致函美國版權辦公室的信&#xff08;PDF&#xff09;中指出&#xff0c;技術保護措施和數字限制管理&#xff08;即DRM&#x…

改數據庫表結構類型兩種方法

alter table user change password password varchar(128) not null; alter table user modify column password varchar(128) not null;

申請評分卡(A卡)的開發過程(1)

前言&#xff1a; 本篇文章上接《申請評分卡簡介》&#xff0c;有需要的童鞋可以參考下&#xff1a;https://blog.csdn.net/qq_16633405/article/details/107744921 下面介紹下A卡的開發步驟。 開發過程 1、評分卡模型開發步驟&#xff1a; 1、立項&#xff1a;場景&#…

提升你的開發效率,10 個 NPM 使用技巧

對于一個項目&#xff0c;常用的一些npm簡單命令包含的功能有&#xff1a;初始化一個文件夾( npm init )&#xff0c;下載npm模塊( npm install )&#xff0c;創建測試( npm test ) 和自定義腳本( npm run )。但是&#xff0c;進一步了解一些 npm 的使用技巧可以徹底改變你的日…

E: 無法獲得鎖 /var/lib/dpkg/lock-frontend - open (11: 資源暫時不可用) E: 無法獲取 dpkg 前端鎖 (/var/lib/dpkg/lock-front

解決&#xff1a; E: 無法獲得鎖 /var/lib/dpkg/lock-frontend - open (11: 資源暫時不可用) E: 無法獲取 dpkg 前端鎖 (/var/lib/dpkg/lock-frontend)&#xff0c;是否有其他進程正占用它&#xff1f; 方法&#xff1a; 重新啟動虛擬機服務器 再在黑屏終端中重新嘗試輸入su…