Java 多執行緒(Java.Thread)------ 執行緒協作(生產者消費者模式)
執行緒協作
-
應用場景:生產者消費者模式
- 假設倉庫中只能存放一件產品,生產者將生產出來的產品放入倉庫,消費者將倉庫中產品取走消費
- 如果倉庫中沒有產品,則生產者將產品放入倉庫,否則停止生產並等待,直到倉庫中的產品被消費者取走為止
- 如果倉庫中放有產品,則消費者可以將產品直接取走,否則停止消費並等待,直到倉庫中再次放入產品為止
-
分析:這是一個執行緒同步問題,生產者和消費者共享同一個資源,並且生產者和消費者相互依賴,互為條件
-
在生產者和消費者問題中,僅有synchronized是不夠的
- synchronized可阻止併發更新同一個共享資源,實現了同步
- synchronized不能用來實現不同執行緒之間的訊息傳遞
-
解決執行緒之間通訊問題的幾個方法:
- wait():表示執行緒一直等待,直到其他執行緒通知,與sleep()不同,會釋放鎖
- wait(long timeout):指定等待的毫秒數
- notify():喚醒一個處於等待狀態的執行緒
- notifyAll():喚醒同一個物件上所有呼叫wait()方法的執行緒,優先順序高的執行緒優先排程
- 以上方法都是Object類的方法,都只能在同步方法或者同步程式碼塊中使用,否則會丟擲異常IlledalMonitorStateException
-
解決方式一:併發協作模式“生產者/消費者模式”---->管程法
- 生產者:負責生產資料的模組(可能是方法,物件,執行緒,程式)
- 消費者:負責處理資料的模組(可能是方法,物件,執行緒,程式)
- 緩衝區:消費者不能直接使用生產者的資料,他們之間有個緩衝區
- 生產者將生產好的資料放到緩衝區,消費者從緩衝區拿出資料
package www.bh.c.threadtest;
//併發協作模式“生產者/消費者模式”---->管程法
public class PCTest {
public static void main(String[] args) {
Buffer buffer = new Buffer();
new Producer(buffer).start();
new Consumer(buffer).start();
}
}
//生產者
class Producer extends Thread{
Buffer buffer;
public Producer(Buffer buffer){
this.buffer=buffer;
}
//生產
@Override
public void run() {
for (int i = 0; i < 100; i++) {
buffer.push(new Product(i));
System.out.println("生產了"+i+"個產品");
}
}
}
//消費者
class Consumer extends Thread{
Buffer buffer;
public Consumer(Buffer buffer){
this.buffer=buffer;
}
//消費
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消費了---->"+buffer.pull().id+"個產品");
}
}
}
//產品
class Product{
int id;
public Product(int id) {
this.id = id;
}
}
//緩衝區
class Buffer{
//緩衝區大小
Product[] products=new Product[10];
//緩衝區計數器
int count=0;
//生產者放入產品
public synchronized void push(Product product){
//如果緩衝區已滿,通知消費者消費
if (count==products.length){
//等待消費,生產暫停
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//如果沒有滿,就繼續放入產品
products[count]=product;
count++;
//通知消費
this.notifyAll();
}
}
//消費者消費產品
public synchronized Product pull(){
//判斷是否有產品可以消費
if(count==0){
//消費者等待生產
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
Product product=products[count];
//消費完了,通知生產者生產
this.notifyAll();
return product;
}
}
相關文章
- Java多執行緒——生產者消費者示例Java執行緒
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- 執行緒間的協作(2)——生產者與消費者模式執行緒模式
- Java 多執行緒學習(執行緒通訊——消費者和生產者)Java執行緒
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- Java多執行緒——消費者與生產者的關係Java執行緒
- python執行緒通訊與生產者消費者模式Python執行緒模式
- python中多執行緒消費者生產者問題Python執行緒
- Python-多執行緒及生產者與消費者Python執行緒
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- java多執行緒之消費生產模型Java執行緒模型
- C#多執行緒學習(三) 生產者和消費者C#執行緒
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- java 執行緒池、多執行緒併發實戰(生產者消費者模型 1 vs 10) 附案例原始碼Java執行緒模型原始碼
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- Java多執行緒程式設計(同步、死鎖、生產消費者問題)Java執行緒程式設計
- java學習回顧---生產者與消費者問題以及多執行緒補充Java執行緒
- 從一次生產消費者的bug看看執行緒池如何增加執行緒執行緒
- Java多執行緒消費訊息Java執行緒
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- Thinking in Java---執行緒通訊+三種方式實現生產者消費者問題ThinkingJava執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 多執行緒必考的「生產者 - 消費者」模型,看齊姐這篇文章就夠了執行緒模型
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- 執行緒同步介紹及 生產者消費者問題舉例 C#版執行緒C#
- 面經梳理-java多執行緒同步協作Java執行緒
- kafka多執行緒順序消費Kafka執行緒
- 程式執行緒對比總結以及對於生產者消費者的場景分析執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒