49 Java 生產者 消費者模式親手實測採坑

2021-09-25 05:01:40 字數 3178 閱讀 3277

生產者消費者模型具體來講,就是在乙個系統中,存在生產者和消費者兩種角色和乙個記憶體緩衝區。

乙個或者多個生產者 產生商品(資料) 並將商品存放到倉庫中(記憶體緩衝區);

乙個或者多個消費者 消費商品(資料)並將商品從倉庫中取出(記憶體緩衝區);

倉庫有訪問功能,並且當倉庫存滿資料時,只取不存;當倉庫沒有商品時,只存不取。

模型一
使用 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 指標向上...