栈----生产者消费者实例
生活随笔
收集整理的這篇文章主要介紹了
栈----生产者消费者实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
棧----生產者消費者實例
實際是線程的應用:
其相當于一個工廠**,工廠生產,然后存儲到倉庫,然后有消費者從倉庫取出。
這次我使用的倉庫是棧,然后消費者,生產者分別是一個對象,然后產品是一個對象,見下圖
1.產品對象不重要,就是個實體類,
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()方法來幫我們實現我們的多線程任務*/} }總結
以上是生活随笔為你收集整理的栈----生产者消费者实例的全部內容,希望文章能夠幫你解決所遇到的問題。