Contents
20.7. 线程间通信¶
Stack.java
package com.a51work.cn;
public class Stack {
// 指针指向初始值0
private int pointer = 0;
// 堆栈里面有5个字符的空间
private char[] data = new char[5];
// 压栈方法加上互斥锁
public synchronized void push(char c) {
// 堆栈已满,不能压栈
while (pointer == data.length) {
try {
// 等待直到有数据出栈
this.wait();
} catch (InterruptedException e) {
}
}
// 通知其他线程把数据出栈
this.notify();
// 数据压栈
data[pointer] = c;
// 指针向上移动
pointer++;
}
// 出栈方法加上互斥锁
public synchronized char pop() {
// 堆栈无数据,不能出栈
while (pointer == 0) {
try {
// 等待直到有数据压栈
this.wait();
} catch (InterruptedException e) {
}
}
// 通知其他线程把数据压栈
this.notify();
// 指针向下移动
pointer--;
// 数据出栈
return data[pointer];
}
}
HelloWord03.java
package com.a51work.cn;
public class HelloWorld03 {
public static void main(String[] args) {
Stack stack = new Stack();
// 下面的消费者和生产者所操作的是同一个堆栈对象stack
// 生产者线程
Thread producer = new Thread(() -> {
char c;
for (int i = 0; i < 10; i++) {
// 随机产生10个字符
c = (char) (Math.random() * 26 + 'A');
// 把字符压栈
stack.push(c);
// 打印字符
System.out.println("生产: " + c);
try {
// 每产生一个字符线程就睡眠
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
}
}
});
// 消费者线程
Thread consumer = new Thread(() -> {
char c;
for (int i = 0; i < 10; i++) {
// 从堆栈中读取字符
c = stack.pop();
// 打印字符
System.out.println("消费:" + c);
try {
// 每产生一个字符线程就睡眠
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
}
}
});
producer.start(); //启动生产者线程
consumer.start(); //启动消费者线程
}
}