例子
package day03;
public class Thread_01_ProducerConsumer {
public static void main(String[] args) {
SynStack s = new SynStack();
Thread t1 = new Thread(new Producer(s));
Thread t2 = new Consumer(s);
t1.start();
t2.start();
}
}
//生产者线程类
class Producer implements Runnable{
SynStack s;
public Producer(SynStack s) {
super();
this.s = s;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
s.push((char)(i+'a'));
}
}
}
//消费者线程类
class Consumer extends Thread{
SynStack s;
public Consumer(SynStack s) {
super();
this.s = s;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
char c = s.pop();
}
}
}
// 业务类
class SynStack {
char[] data = new char[6];
// 已添加元素个数,也是下一个元素的下标
int count = 0;
// 生产者 : 库存满了 就等待
// 消费者 : 没有库存了 就等待
public synchronized void push(char c){
// 判断库存是否满了
if (count >= data.length) {
// 如果满了 就进入等待
try {
// 消费者是库存没了 再进入等待
// 而这里都满了,说明消费者没有进入等待状态
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 到这里 说明没有满
// 库存为1 也是没有满 , 库存为0 也是没有满,而且库存为0 时 消费者就进入等待了
// 所以 这里消费者可能进入等待 , 应该唤醒消费者
if (count == 0) {
this.notifyAll();
}
// 添加库存
data[count] = c;
count++;
System.out.println("生产了 : "+c + " 还有 : "+count+" 个库存");
}
public synchronized char pop(){
// 判断是否还有库存
if (count == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 到这里说明有库存 , 那么只要库存没满 就提醒可以生产
if (count < 6) {
this.notifyAll();
}
count--;
char c = data[count];
System.out.println("消费了 : "+c + " 还有 : "+count+" 个库存");
return c;
}
}
/*
* 运行结果:
生产了 : a 还有 : 1 个库存
生产了 : b 还有 : 2 个库存
生产了 : c 还有 : 3 个库存
生产了 : d 还有 : 4 个库存
生产了 : e 还有 : 5 个库存
生产了 : f 还有 : 6 个库存
消费了 : f 还有 : 5 个库存
消费了 : e 还有 : 4 个库存
消费了 : d 还有 : 3 个库存
消费了 : c 还有 : 2 个库存
消费了 : b 还有 : 1 个库存
消费了 : a 还有 : 0 个库存
生产了 : g 还有 : 1 个库存
生产了 : h 还有 : 2 个库存
生产了 : i 还有 : 3 个库存
生产了 : j 还有 : 4 个库存
生产了 : k 还有 : 5 个库存
生产了 : l 还有 : 6 个库存
消费了 : l 还有 : 5 个库存
消费了 : k 还有 : 4 个库存
消费了 : j 还有 : 3 个库存
消费了 : i 还有 : 2 个库存
消费了 : h 还有 : 1 个库存
消费了 : g 还有 : 0 个库存
生产了 : m 还有 : 1 个库存
生产了 : n 还有 : 2 个库存
生产了 : o 还有 : 3 个库存
生产了 : p 还有 : 4 个库存
生产了 : q 还有 : 5 个库存
生产了 : r 还有 : 6 个库存
消费了 : r 还有 : 5 个库存
消费了 : q 还有 : 4 个库存
消费了 : p 还有 : 3 个库存
消费了 : o 还有 : 2 个库存
消费了 : n 还有 : 1 个库存
消费了 : m 还有 : 0 个库存
生产了 : s 还有 : 1 个库存
生产了 : t 还有 : 2 个库存
消费了 : t 还有 : 1 个库存
消费了 : s 还有 : 0 个库存
*/