日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈----生产者消费者实例

發布時間:2025/5/22 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈----生产者消费者实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧----生產者消費者實例

實際是線程的應用:
其相當于一個工廠**,工廠生產,然后存儲到倉庫,然后有消費者從倉庫取出。
這次我使用的倉庫是棧,然后消費者,生產者分別是一個對象,然后產品是一個對象,見下圖
1.產品對象不重要,就是個實體類,

package threaddemo;public class Goods {private String name;private double price;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Goods(String name, double price) {this.name = name;this.price = price;}@Overridepublic String toString() {return "Goods{" +"name='" + name + '\'' +", price=" + price +'}';} }

2.重點在倉庫

package threaddemo;public class MyStack {private Goods[] goodsStack; //存儲數組private int index; //棧頂指針private int stackCount; //棧的容量public MyStack(int stackCount) { //初始化棧this.stackCount = stackCount; //成員變量和局部變量不同if(this.stackCount<=0){this.stackCount=10;}goodsStack = new Goods[this.stackCount];index = 0;}public synchronized void push(Goods goods){ //同步鎖if(index>=stackCount){ //判斷是否滿了try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}goodsStack[index]=goods;index++;System.out.println("生產了一個產品");this.notifyAll(); //喚醒多個線程}public synchronized Goods pop(){if(index<=0){ //判斷是否為空try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}index--;Goods goods = goodsStack[index];goodsStack[index] =null;System.out.println("消費了一個產品");this.notifyAll(); //*********return goods;} }

【注】
這里面注意:同步鎖的應用:可以看看這個博主寫的https://www.cnblogs.com/weibanggang/p/9470718.html

在我的代碼中應用的我也簡要總結一下:
我使用Synchronized是修飾的方法:一個線程訪問一個對象中的synchronized(this)同步方法時,其他試圖訪問該對象的線程將被阻塞。

3.生產者消費者:

消費者

package threaddemo;public class ConsumerThread implements Runnable { //繼承接口和類都行,這個是接口,Thread還要繼承該接口。但是不能使用start方法了private MyStack myStack;public ConsumerThread(MyStack myStack) {this.myStack = myStack;}public void run(){while (true){Goods goods = myStack.pop(); //消費之后線程休眠1stry {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}} }

生產者

package threaddemo;public class ProducerThread extends Thread {//繼承接口和類都行,這個是繼承類Thread,但是Thread還要繼承Runner接口private MyStack stack;public ProducerThread(MyStack stack) {this.stack = stack;}public void run(){while(true){Goods g = new Goods("薯條",14.5);stack.push(g);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}} }

【注】

1.上述方法繼承接口和類都行,但Thread類還要繼承Runnable接口。但是直接繼承Runnable接口就不能直接使用start方法了
2. 如果僅僅是調用run方法的話,就相當于還是單線程,會順序執行。但是在Test類實現Runnable接口之后Test類是沒有start()方法的,只有run()方法。這時調用run方法也僅僅是調用一個普通方法,不會開啟新線程。 我們此時就需要Thread類的start()方法來幫我們實現我們的多線程任務

4.測試方法

package threaddemo;public class Test {public static void main(String[] args) { //記得寫一個隊列的MyStack stack = new MyStack(10);ProducerThread p = new ProducerThread(stack);p.start();//調用start使用多線程,而調用run不使用多線程new Thread( new ConsumerThread(stack)).start();/*如果僅僅是調用run方法的話,就相當于還是單線程,會順序執行。但是在Test類實現Runnable接口之后,Test類是沒有start()方法的,只有run()方法。這時調用run方法也僅僅是調用一個普通方法,不會開啟新線程。我們此時就需要Thread類的start()方法來幫我們實現我們的多線程任務*/} }

總結

以上是生活随笔為你收集整理的栈----生产者消费者实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。