线程并发协作(生产者/消费者模式)馒头案例

网友投稿 576 2022-11-21

线程并发协作(生产者/消费者模式)馒头案例

线程并发协作(生产者/消费者模式)馒头案例

多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要 的多线程并发协作模型“生产者/消费者模式”。

package com.yqq.app12;import lombok.AllArgsConstructor;import lombok.Getter;/** * @Author yqq * @Date 2021/11/28 23:52 * @Version 1.0 *//** * 馒头类 */@AllArgsConstructor@Getterclass ManTou{ private int id;}/** * 定义缓冲区类 */class SyscStack{ //定义存储馒头的数组 private ManTou[] mt = new ManTou[10]; //定义操作盒子的索引 private int index; /** * 放馒头 */ public synchronized void push(ManTou manTou){ //判断盒子是否已经满 while (this.index == this.mt.length){ try { this.wait();//wait执行后,会释放锁,进入阻塞状态, } catch (InterruptedException e) { e.printStackTrace(); } } //唤醒放馒头线程 this.notify(); this.mt[this.index] = manTou; this.index++; } /** * 取馒头 */ public synchronized ManTou pop(){ while (this.index == 0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //唤醒取馒头线程 this.notify();//该方法会唤醒处于等待状态队列中的线程 this.index--; return this.mt[this.index]; }}/** * 生产线程 */class Producer extends Thread{ private SyscStack syscStack; public Producer(SyscStack syscStack){ this.syscStack = syscStack; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("生产馒头"+i); ManTou manTou = new ManTou(i); this.syscStack.push(manTou); } }}/** * 消费者线程 */class Consumer extends Thread{ private SyscStack syscStack; public Consumer(SyscStack syscStack){ this.syscStack = syscStack; } @Override public void run() { for (int i = 0; i < 10; i++) { ManTou manTou = this.syscStack.pop(); System.out.println("取馒头"+i); } }}public class ProduceThread { public static void main(String[] args) { SyscStack ss = new SyscStack(); new Producer(ss).start(); new Consumer(ss).start(); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mapreduce 参数调优
下一篇:SQL面试题-表数据去重分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~