生產者消費者模型具體來講,就是在乙個系統中,存在生產者和消費者兩種角色和乙個記憶體緩衝區。模型一乙個或者多個生產者 產生商品(資料) 並將商品存放到倉庫中(記憶體緩衝區);
乙個或者多個消費者 消費商品(資料)並將商品從倉庫中取出(記憶體緩衝區);
倉庫有訪問功能,並且當倉庫存滿資料時,只取不存;當倉庫沒有商品時,只存不取。
使用 wait() 、 notifyall()來進行阻塞和喚醒執行緒,使用arraylist 從當緩衝區。定義乙個快取佇列
/**
* created by : fumm
* date : 2019/7/11 16:13
* describe : 公共佇列
* 生產者/消費者設計模式顧名思義就是兩個互斥執行緒,乙個負責生產,乙個負責消費,兩者是執行緒不安全的;
* 為了保證互斥執行緒的安全性,需要做對應的處理,以上**使用了synchronized 、wait()、notifyall()來保證。
**/public class publicqueue else catch (interruptedexception e) }}
public synchronized void remove() catch (interruptedexception e)
} else
}}
定義乙個生產者
/**
* created by : fumm
* date : 2019/7/11 16:23
* describe : 生產者執行緒
**/public class producethread extends thread
@override
public void run()
}}
定義乙個消費者
/**
* created by : fumm
* date : 2019/7/11 16:23
* describe : 消費者執行緒
**/public class consumerthread extends thread
@override
public void run()
}}
模型二使用 reentrantlock.lock() condition.await()[等待] condition.signalall() [喚醒]、,使用arraylist 從當緩衝區。
/**
* created by : fumm
* date : 2019/7/11 17:04
* describe : 生產者 消費者 模型2
* 定義乙個快取佇列
**/public class publicqueue2
public void add(t t)
mq.add(t);
// mq.put(putindex, t);
system.out.println("生產者生產 :" + t.tostring());
putindex = (putindex + 1 >= max_num) ? (putindex + 1) % max_num : putindex + 1;
// 喚醒消費者
mremovecondition.signalall();
} catch (interruptedexception e) finally
}public void remove()
// iterator it = mq.entryset().iterator();
// if (it.hasnext())
mq.remove(mq.size() - 1);
maddcondition.signalall();
} catch (interruptedexception e) finally
}// 定義乙個生產者
public static class producethread extends thread
@override
public void run() }}
// 定義乙個消費者
public static class consumerthread extends thread
@override
public void run() }}
}
模型三使用 blockingdeque.put(t) 和 blockingdeque.take(),使用arraylist 從當緩衝區。
/**
* created by : fumm
* date : 2019/7/12 9:07
* describe : todo
**/public class publicqueue4 catch (interruptedexception e)
}public void remove() catch (interruptedexception e)
}public static class producethread extends thread
@override
public void run() }}
public static class consumerthread extends thread
@override
public void run() }}
}
測試類
/**
* created by : fumm
* date : 2019/7/11 15:50
* describe : 測試生產者 和消費者模型
* 1、生產者生產資料到緩衝區中,消費者從緩衝區中取資料。
* 2、如果緩衝區已經滿了,則生產者執行緒阻塞;
* 3、如果緩衝區為空,那麼消費者執行緒阻塞。
**/public class test
}
生產者 消費者模式 java
生產者 消費者模式要求在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出乙個空緩衝區。當消費者執行緒...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
java生產者消費者
題目 請用多執行緒實現乙個生產者類和乙個消費者類,生產者隨機生成20個字元,消費者將字元列印到控制台。class syncstackcatch interruptedexception e this.notify 通知其它執行緒把資料出棧 buffer index c 資料入棧 index 指標向上...