關於Java多執行緒實現生產者和消費者的問題
在學習Java多執行緒併發程式設計的同時,自己寫了一個用wait()和notifyAll()實現的生產者消費者相互阻塞,保持同步的程式。
設定產品緩衝區上限為8,可生產者檢查counter計數器等於8的時候wait()並沒有讓多個生產者執行緒阻塞,而是繼續向下執行,對此表示不解,還請諸位高手們給菜鳥弟弟我一個解答,感激不盡!
設定產品緩衝區上限為8,可生產者檢查counter計數器等於8的時候wait()並沒有讓多個生產者執行緒阻塞,而是繼續向下執行,對此表示不解,還請諸位高手們給菜鳥弟弟我一個解答,感激不盡!
- /*
- * 這是一個與多執行緒有關的以生產者消費者問題為原型的Java程式原始碼。
- * 為了體驗notify和notifyAll方法,我嘗試開啟十個生產者和五個消費者執行緒,對大小為8的緩衝區進行操作,要做到緩衝區產品達到8的時候,生產者執行緒阻塞,直到消費者執行緒減少緩衝區的產品數量,並對阻塞程式進行喚醒。
- * 可現在的問題是,當生產者向緩衝區放入8個產品後,wait()方法並沒有使生產者執行緒們停住,對此表示很疑惑。
- *
- */
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- class myProducer implements Runnable
- {
- private myProAndCon mpc;
- myProducer( myProAndCon mpac ){ this.mpc = mpac; }
- public void run()
- {
- try {
- while(!Thread.interrupted())
- {
- //生產者互斥
- synchronized (this){
- //靜態計數值達到上限,則wait()阻塞,等待被消費者執行緒喚醒
- while ( mpc.get() >= 8 )
- {
- System.out.println(mpc.get());
- wait();
- }
- }
- Thread.sleep(100);
- //未發生阻塞時,向緩衝區內放入產品,增加計數值,並喚醒所有阻塞的消費者執行緒
- synchronized ( mpc.c ){
- System.out.println("[ P ] The number is " + mpc.inc() );
- mpc.c.notifyAll();
- }
- }
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- class myConsumer implements Runnable
- {
- private myProAndCon mpc;
- myConsumer( myProAndCon mpac ){ this.mpc = mpac; }
- public void run()
- {
- try {
- while(!Thread.interrupted())
- {
- //消費者互斥
- synchronized ( this )
- {
- //當緩衝區無產品時,消費者執行緒阻塞,等待被生產者執行緒喚醒
- while ( mpc.get() <= 0 )
- wait();
- }
- Thread.sleep(3000);
- //未發生阻塞時,從緩衝區取出產品,減少計數值,並喚醒所有阻塞的生產者執行緒
- synchronized (mpc.p){
- System.out.println("[ C ] The number is " + mpc.dec() );
- mpc.p.notifyAll();
- }
- }
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- public class myProAndCon {
- //public final int S = 8;
- //緩衝區計數器(靜態)以及對其進行的三個synchronized操作
- volatile private static int counter = 0;
- synchronized static int inc(){ return ++ counter; }
- synchronized static int dec(){ return counter -= 2; }
- synchronized static int get(){ return counter; }
- //構造兩個物件,作為開啟執行緒的引數
- public myConsumer c = new myConsumer(this);
- public myProducer p = new myProducer(this);
- private ExecutorService exec = Executors.newCachedThreadPool();
- public myProAndCon(){
- //開啟十個生產者執行緒
- for ( int i = 0 ; i < 10 ; i ++ )
- exec.execute(p);
- //開啟五個消費者執行緒
- for ( int i = 0 ; i < 5 ; i ++ )
- exec.execute(c);
- }
- //主函式呼叫myProAndCon類構造方法,開始執行各個執行緒
- public static void main(String[] s)
- {
- new myProAndCon();
- }
- }
在學習中有困難需要交流不知道怎麼去做的可以關注微信公眾號:javaniuniu得到大神指導和幫助,獲取免費的聽課許可權。
相關文章
- Java多執行緒——生產者和消費者模式Java執行緒模式
- Java多執行緒——消費者與生產者的關係Java執行緒
- Java多執行緒——生產者消費者示例Java執行緒
- java多執行緒總結六:經典生產者消費者問題實現Java執行緒
- python中多執行緒消費者生產者問題Python執行緒
- 多執行緒-生產者消費者問題程式碼1執行緒
- Java多執行緒14:生產者/消費者模型Java執行緒模型
- 多執行緒之生產者消費者執行緒
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- java實現生產者消費者問題Java
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- 用Python多執行緒實現生產者消費者模式Python執行緒模式
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- 多執行緒下的生產者和消費者-BlockingQueue執行緒BloC
- JAVA執行緒消費者與生產者模型Java執行緒模型
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- 多執行緒-生產者消費者問題程式碼2並解決執行緒安全問題執行緒
- Java實現生產者和消費者Java
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- Java 多執行緒(Java.Thread)------ 執行緒協作(生產者消費者模式)Java執行緒thread模式
- Java多執行緒-併發協作(生產者消費者模型)Java執行緒模型
- Thinking in Java---執行緒通訊+三種方式實現生產者消費者問題ThinkingJava執行緒
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- java學習回顧---生產者與消費者問題以及多執行緒補充Java執行緒
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- C#多執行緒學習(三) 生產者和消費者C#執行緒
- C# 多執行緒學習(3) :生產者和消費者C#執行緒
- Python-多執行緒及生產者與消費者Python執行緒
- Java多執行緒15:Queue、BlockingQueue以及利用BlockingQueue實現生產者/消費者模型Java執行緒BloC模型
- Java實現生產者-消費者模型Java模型
- 多執行緒-生產者消費者之等待喚醒機制執行緒
- 生產者和消費者(.net實現)
- Java多執行緒之併發協作生產者消費者設計模式Java執行緒設計模式
- Linux下生產者與消費者的執行緒實現Linux執行緒
- 多執行緒 -- 移動檔案(生產者,消費者模式應用)執行緒模式
- java 執行緒池、多執行緒併發實戰(生產者消費者模型 1 vs 10) 附案例原始碼Java執行緒模型原始碼