import java.util.concurrent.CopyOnWriteArraySet;
/**
* @Description: 以生产者消费者的简单示例演示锁的等待与唤醒
* @Date 2020年12月1日00:03:57
* @Version V1.0
*/
public class Demo1_1 {
//创建数据集合
private static volatile CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>();
public static void main(String[] args) {
//创建创造者和消费者线程并启动
new Thread(new Creater()).start();
new Thread(new Consumer()).start();
}
//创造者
public static class Creater implements Runnable {
//重写线程run方法
public void run() {
//实现循环运行,此处写死循环
for (; ; ) {
//竞争获取set的监视器锁
synchronized (set) {
while (set.size() > 0) {
try {
//set的个数大于0时,不创建新的产品,此处释放监视器锁
set.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}// end while
//模拟生产过程
for (int i = 1; i <= 10; i++) {
set.add("第" + i + "个产品");
System.out.println("生产第" + i + "个产品");
}
//生产完毕,唤醒所有线程,进入竞争态
set.notifyAll();
}
}
}
}
//消费者
public static class Consumer implements Runnable {
//重写线程run方法
public void run() {
//实现循环运行,此处写死循环
for (; ; ) {
//竞争获取set的监视器锁
synchronized (set) {
while (set.size() == 0) {
try {
//当set大小为0,即没有可以消费的产品,此处释放监视器锁
set.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}// end while
//当set大小不为0,即有可消费的产品,模拟消费
set.clear();
System.out.println("包子被买光");
//唤醒所有线程,进入竞争态
set.notifyAll();
}
}
}
}
}