4.一生产与一消费:操作栈
package org.test.t6.t_3;import java.util.ArrayList;import java.util.List;//使生产者向堆栈List对象中放入数据,使消费者从List堆栈中取出数据,最大容量是1//实验环境只有一个生产者与一个消费者public class MyStack {private List list = new ArrayList();synchronized public void push() {try {if (list.size() == 1) {this.wait();}list.add("anyString=" + Math.random());this.notify();System.out.println("push=" + list.size());} catch (InterruptedException e) {e.printStackTrace();}}synchronized public String pop() {String returnValue = "";try {if (list.size() == 0) {System.out.println("pop操作中的:" + Thread.currentThread().getName() + " 线程呈wait状态");this.wait();}returnValue = "" + list.get(0);list.remove(0);this.notify();System.out.println("pop=" + list.size());} catch (InterruptedException e) {e.printStackTrace();}return returnValue;}}
//生产者public class ThreadP extends Thread {private P p;public ThreadP(P p) {super();this.p = p;}@Overridepublic void run() {while (true) {p.pushService();}}}
//消费者public class ThreadC extends Thread {private C r;public ThreadC(C r) {super();this.r = r;}@Overridepublic void run() {while (true) {r.popService();}}}
//生产者服务public class P {private MyStack myStack;public P(MyStack myStack) {super();this.myStack = myStack;}public void pushService() {myStack.push();}}
//消费者服务public class C {private MyStack myStack;public C(MyStack myStack){super();this.myStack = myStack;}public void popService() {System.out.println("pop=" + myStack.pop());}}
public class Run {public static void main(String[] args) {MyStack myStack = new MyStack();P p = new P(myStack);C r = new C(myStack);ThreadP threadP = new ThreadP(p);ThreadC threadC = new ThreadC(r);threadP.start();threadC.start();}}
程序运行结果是size()不会大于1。
通过使用生产者/消费者模式,容器size()的值不会大于1,值0和1之间的交替,也就是生产和消费两个过程在交替执行。
因为条件的改变时并没有得到及时的响应,所以多个呈wait状态的线程被唤醒,继而执行list.remove(0)代码而出现异常。
修改MyStack类中的if为while。并且修改MyStack类。
此时出现了假死状态,把MyStack类中的notify()方法改为notifyAll()方法,即可。
6.多生产-消费:操作栈
本示例是使用生产者向堆栈List对象中放入数据,使用消费者从List堆栈中取出数据。
List最大容量还是1.使用环境是多个生产者与一个消费者。
修改main中代码:
MyStack myStack = new MyStack();P p = new P(myStack);P p1 = new P(myStack);P p2 = new P(myStack);P p3 = new P(myStack);P p4 = new P(myStack);P p5 = new P(myStack);ThreadP pThreadP = new ThreadP(p);ThreadP threadp1 = new ThreadP(p1);ThreadP threadp2 = new ThreadP(p2);ThreadP threadp3 = new ThreadP(p3);ThreadP threadp4 = new ThreadP(p4);ThreadP threadp5 = new ThreadP(p5);threadp1.start();threadp2.start();threadp3.start();threadp4.start();threadp5.start();C c1 = new C(myStack);ThreadC cThreadC = new ThreadC(c1);cThreadC.start();
7.多生产与多消费:操作栈
本示例是使用生产者向栈List对象中放入数据,使用消费者从List栈中取出数据。List最大容量是1,实验环境是多个生产者与多个消费者。
修改main中的代码:
package org.test.t6.t_3;public class Run {public static void main(String[] args)throws InterruptedException {MyStack myStack = new MyStack();P p = new P(myStack);P p1 = new P(myStack);P p2 = new P(myStack);P p3 = new P(myStack);P p4 = new P(myStack);P p5 = new P(myStack);ThreadP pThreadP = new ThreadP(p);ThreadP threadp1 = new ThreadP(p1);ThreadP threadp2 = new ThreadP(p2);ThreadP threadp3 = new ThreadP(p3);ThreadP threadp4 = new ThreadP(p4);ThreadP threadp5 = new ThreadP(p5);threadp1.start();threadp2.start();threadp3.start();threadp4.start();threadp5.start();C c1 = new C(myStack);C c2 = new C(myStack);C c3 = new C(myStack);C c4 = new C(myStack);C c5 = new C(myStack);ThreadC cThreadC1 = new ThreadC(c1);ThreadC cThreadC2 = new ThreadC(c2);ThreadC cThreadC3 = new ThreadC(c3);ThreadC cThreadC4 = new ThreadC(c4);ThreadC cThreadC5 = new ThreadC(c5);cThreadC1.start();cThreadC2.start();cThreadC3.start();cThreadC4.start();cThreadC5.start();}}
list对象的size()并没有超过1.