生产者消费者模式是操作系统中的经典内容。从字面意思上来理解“生产者消费者模式”就是:生产者生产了商品,放在货架上之后,由消费者去拿走。这就形成了一个生产者消费者的环节。
例如以下场景:一个餐厅有两个厨子和三个消费者,出餐窗口只有一个,所以两个厨子不能同时出餐,同样的,每次桌子上的餐品有限,因此消费者也不能同时执行拿操作。我们可以将“出餐”操作和“拿”操作当作是两个资源,然后设定五个线程去争夺这些资源。通过多线程的方式来模拟生产者消费者。
队列作为“桌子”是全局都要用的,因此将其声明为全局类型的
private static final Queue<Object> queue=new LinkedList<>();
接下来我们来模拟出餐的操作(add)
由于厨子们争抢出餐的机会,因此这个方法应该是不断循环的
private static void add(){
while(true){
Thread.sleep(3000);
sync(queue){//这里上锁,以防同时调用这个方法
String name=Thread.currentThread().getName();
sout(new Date+" "+name+"出餐");
queue.offer(new Object());//将餐品丢入桌子
}
}
}
同样的,拿操作也是需要上锁的,防止这个资源同时被多个线程拿到
private static void eat(){
while(true){
Thread.sleep(4000);//比出餐慢一秒
sync(queue){
while(queue.isEmpty()){//如果这个队列为空,则将该线程设为等待状态
queue.wait();
}
queue.poll();//拿走餐品
}
}
}
然后我们只需要创建五个线程,按照需求分别调用其需要的方法,来争取资源即可。代码如下:
Thread thread1=new Thread(()->{add()},"name")
thread.start();//其他线程以此类推。
运行结果如下:
此文章为个人复习使用,如有不足多多指出。