java 多线程 生产者和消费者有关问题
java 多线程 生产者和消费者问题
用一个数据来表示数据存储空间
package com.yan.test; public class SyncStack { private int index = 0; private char[] stack = new char[6]; public synchronized void push(char temp) { if (index == stack.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); stack[index] = temp; index++; System.out.println(Thread.currentThread().getName() + " push " + temp); } public synchronized char pop() { if (index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); index--; System.out.println("___" + Thread.currentThread().getName() + " ---pop " + stack[index]); return stack[index]; } }
生产者
package com.yan.test; public class Produce implements Runnable { private SyncStack stack; int i = 0; public Produce(SyncStack stack) { super(); this.stack = stack; } public void run() { while (true) { synchronized (this) { if (i < 28) { stack.push((char) ((char) i + 'A')); i++; } else { break; } } } } }
消费者
package com.yan.test; public class Consumer implements Runnable { private SyncStack stack; int i = 0; public Consumer(SyncStack stack) { super(); this.stack = stack; } public void run() { while (true) { synchronized (this) { if (i < 28) { stack.pop(); i++; } else { break; } } } } }
测试的main方法
package com.yan.test; public class TestSysn { public static void main(String[] args) { SyncStack s = new SyncStack(); Produce p = new Produce(s); Consumer c = new Consumer(s); Thread t1 = new Thread(p); t1.setName("product1"); Thread t3 = new Thread(p); t3.setName("product2"); Thread t5 = new Thread(p); t5.setName("product3"); t3.start(); t1.start(); t5.start(); Thread t2 = new Thread(c); t2.setName("Consumer1"); Thread t4 = new Thread(c); t4.setName("Consumer2"); t2.start(); t4.start(); } }
结果
product2 push A product1 push B product2 push C product1 push D product2 push E product1 push F ___Consumer1 ---pop F product2 push G ___Consumer1 ---pop G ___Consumer1 ---pop E ___Consumer1 ---pop D ___Consumer1 ---pop C ___Consumer1 ---pop B ___Consumer1 ---pop A product1 push H ___Consumer1 ---pop H product3 push I ___Consumer1 ---pop I product2 push J ___Consumer1 ---pop J product1 push K ___Consumer1 ---pop K product3 push L ___Consumer1 ---pop L product2 push M ___Consumer1 ---pop M product1 push N ___Consumer2 ---pop N product3 push O ___Consumer1 ---pop O product2 push P ___Consumer2 ---pop P product1 push Q ___Consumer1 ---pop Q product3 push R ___Consumer2 ---pop R product2 push S ___Consumer1 ---pop S product1 push T ___Consumer2 ---pop T product3 push U ___Consumer1 ---pop U product2 push V ___Consumer2 ---pop V product1 push W ___Consumer1 ---pop W product3 push X ___Consumer2 ---pop X product2 push Y ___Consumer1 ---pop Y product1 push Z product3 push [ ___Consumer2 ---pop [ product2 push \ ___Consumer1 ---pop \ ___Consumer2 ---pop Z