這是乙個執行緒同步問題,生產者消費者共享乙個資源,並且生產者消費者之間相互依賴,互為條件:
對於生產者,沒有生產產品之前,需通知消費者等待,而生產產品之後需要馬上通知消費者消費;
對於消費者,在消費之後,需要通知生產者已經結束消費,需要生產新的產品提供消費;
在生產者消費者問題中,僅有synchronized是不夠的;
synchronized可阻止併發更新同乙個共享資源,實現了同步;
synchronized不能用來實現不同執行緒之間的訊息傳遞(通訊);
解決方式一:管程法(併發協作模型)
生產者:負責生產資料模組
消費者:負責處理資料模組
緩衝區:生產者將生產好的資料放入緩衝區,消費者從緩衝區拿出資料
例項:
package com.keji.oop;
//解決生產者消費者之間的問題,利用緩衝區解決--管程法
public
classpc}
//生產者
class
producer
extends
thread
//生產
@override
public
void
run()}
}//消費者
class
consumer
extends
thread
//消費
@override
public
void
run()}
}//產品
class
product
}//緩衝區
class
buffer
catch
(interruptedexception e)
}//如果容器未滿,需要丟入產品
products[count]
= product;
count++
;//通知消費者可以消費了
this
.notifyall()
;}//消費者消費產品
public
synchronized product pop()
catch
(interruptedexception e)
}//如果可以消費
count--
; product product = products[count]
;//通知生產者已經消費,讓生產者生產
this
.notifyall()
;return product;
}}
結果:
通過緩衝區解決了生產者消費者的問題!
解決方式二:訊號燈法(併發協作模型)
類似紅燈停,綠燈行,通過使用標誌位方式,來判斷執行緒的監聽、喚醒、等待等;
例項:
package com.keji.oop;
//測試生產者消費者方法2--訊號燈法:標誌位解決
public
class
pc2}
//生產者--演員
class
actor
extends
thread
@override
public
void
run(
)else}}
}//消費者--觀眾
class
audience
extends
thread
@override
public
void
run()}
}//產品--節目
class
program
catch
(interruptedexception e)
} system.out.
println
("演員表演了"
+voice)
;//通知觀眾**
this
.notifyall()
;//通知喚醒
this
.voice = voice;
this
.flag =
!this
.flag;
}//**方法
public
synchronized
void
watch()
catch
(interruptedexception e)
} system.out.
println
("觀眾**了"
+voice)
;//**完後,通知演員表演
this
.notifyall()
;this
.flag =
!this
.flag;
}}
結果:
通過使用標誌位解決了生產者消費者之間的問題!
生產者消費者執行緒
include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...
生產者消費者執行緒
該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...
執行緒的生產者消費者
新建乙個產品person package cn.lucky.producer author lucky public class person public synchronized void pop 新建生產者 package cn.lucky.producer author lucky publ...