用一个数据来表示数据存储空间
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