一生产和一消费:操作栈
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("生产 往list中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("消费线程 从list中取pop=" + list.size()); } catch (InterruptedException e) { e.printStackTrace(); } return returnValue; } }
public class P_Thread extends Thread {//生产线程 private P p; public P_Thread(P p) { super(); this.p = p; } @Override public void run() { while (true) { p.pushService(); } } }
public class C_Thread extends Thread {//消费线程 private C r; public C_Thread(C r) { super(); this.r = r; } @Override public 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); P_Thread pThread = new P_Thread(p); C_Thread rThread = new C_Thread(r); pThread.start(); rThread.start(); } }
一生产和多消费
更改上面案例的main方法,将if改成while notify改成notifyall
public static void main(String[] args) throws InterruptedException { MyStack myStack = new MyStack(); P p = new P(myStack); C r1 = new C(myStack); C r2 = new C(myStack); C r3 = new C(myStack); C r4 = new C(myStack); C r5 = new C(myStack); P_Thread pThread = new P_Thread(p); pThread.start(); C_Thread cThread1 = new C_Thread(r1); C_Thread cThread2 = new C_Thread(r2); C_Thread cThread3 = new C_Thread(r3); C_Thread cThread4 = new C_Thread(r4); C_Thread cThread5 = new C_Thread(r5); cThread1.start(); cThread2.start(); cThread3.start(); cThread4.start(); cThread5.start(); }
多生产和多消费案例:
public static void main(String[] args) throws InterruptedException { MyStack myStack = new 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); P p6 = new P(myStack); P_Thread pThread1 = new P_Thread(p1); P_Thread pThread2 = new P_Thread(p2); P_Thread pThread3 = new P_Thread(p3); P_Thread pThread4 = new P_Thread(p4); P_Thread pThread5 = new P_Thread(p5); P_Thread pThread6 = new P_Thread(p6); pThread1.start(); pThread2.start(); pThread3.start(); pThread4.start(); pThread5.start(); pThread6.start(); C r1 = new C(myStack); C r2 = new C(myStack); C r3 = new C(myStack); C r4 = new C(myStack); C r5 = new C(myStack); C r6 = new C(myStack); C r7 = new C(myStack); C r8 = new C(myStack); C_Thread cThread1 = new C_Thread(r1); C_Thread cThread2 = new C_Thread(r2); C_Thread cThread3 = new C_Thread(r3); C_Thread cThread4 = new C_Thread(r4); C_Thread cThread5 = new C_Thread(r5); C_Thread cThread6 = new C_Thread(r6); C_Thread cThread7 = new C_Thread(r7); C_Thread cThread8 = new C_Thread(r8); cThread1.start(); cThread2.start(); cThread3.start(); cThread4.start(); cThread5.start(); cThread6.start(); cThread7.start(); cThread8.start(); }
public class MyStack { private List list = new ArrayList(); synchronized public void push() { try { while (list.size() == 1) { this.wait(); } list.add("anyString=" + Math.random()); this.notifyAll(); System.out.println("生产线程往list集合中push 集合的大小为=" + list.size()); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized public String pop() { String returnValue = ""; try { while (list.size() == 0) { System.out.println("pop操作中的:消费线程 " + Thread.currentThread().getName() + " 线程呈wait状态"); this.wait(); } returnValue = "" + list.get(0); list.remove(0); this.notifyAll(); System.out.println("消费线程 list集合取值pop= 集合的大小为" + list.size()); } catch (InterruptedException e) { e.printStackTrace(); } return returnValue; } }