Java多线程实现生产者消费者

生产者消费者模式是操作系统中的经典内容。从字面意思上来理解“生产者消费者模式”就是:生产者生产了商品,放在货架上之后,由消费者去拿走。这就形成了一个生产者消费者的环节。

例如以下场景:一个餐厅有两个厨子和三个消费者,出餐窗口只有一个,所以两个厨子不能同时出餐,同样的,每次桌子上的餐品有限,因此消费者也不能同时执行拿操作。我们可以将“出餐”操作和“拿”操作当作是两个资源,然后设定五个线程去争夺这些资源。通过多线程的方式来模拟生产者消费者。

队列作为“桌子”是全局都要用的,因此将其声明为全局类型的

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();//其他线程以此类推。

运行结果如下:

 此文章为个人复习使用,如有不足多多指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值