线程练习-吃馍馍

学习线程,处理共享资源,要保证每个线程对资源是安全的,这里模拟一个吃馍馍的例子,用一个线程作生产者单独生成镆镆,再随机生成几个线程来模拟消费者吃馍馍,生产的馍馍为0后其消费者无法再吃到馍馍,只能等生产者生产馍馍。

 static Mutex m = new Mutex();
        static void Main(string[] args)
        {
            momo = new Momo();
            CreateMomo();
            for (int j = 0; j < new Random().Next(3); j++)
            {
                while (true)
                {

                    Consume();
                    Thread.Sleep(1000);
                }
            }
        }
        static Momo momo = null;
        static int i = 0;
        public async static void CreateMomo()
        {

            await Task.Run(async () =>
            {
                while (true)
                {

                    await Task.Delay(new Random().Next(2000));
                    m.WaitOne();

                    //生产Momo
                    momo.list.Add(new Momo(++i));

                    Console.WriteLine("生产一个MOmo,共有Momo:" + momo.Count);
                    m.ReleaseMutex();
                }
            });
        }

        public async static void Consume()
        {
            await Task.Run(async () =>
            {
                await Task.Delay(new Random().Next(20000));
                m.WaitOne();
                if (momo.Count <= 0)
                {
                    Console.WriteLine("无Momo," + Thread.CurrentThread.ManagedThreadId + "没吃着");
                    m.ReleaseMutex();
                    return;
                }
                momo.list.RemoveAt(0);
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "吃了一个,还剩" + momo.Count);
                m.ReleaseMutex();
            });
        }
时间: 2024-08-28 17:54:43

线程练习-吃馍馍的相关文章

python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: 场景一:小编(主)先吃完了,xiaoming(客)和xiaowang(客)还没吃完,这种场景会导致结账的人先走了,剩下两个小伙伴傻眼了... 场景二:小编(主)先吃完了,xiaoming和xiaowang还没吃饱,一起结账走人. 场景三:小编(主)先等xiaoming和xiaowang吃饱了,小编最后结账一起走人. 主线程与子线程 场景一:主线程已经结束了,子线程还在跑 1.我们把thread1.

python笔记10-多线程之线程同步(锁lock)

前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸.为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸熟了再开吃,那么python如何模拟这种场景呢? 未锁定 1.如果多个线程同时操作某个数据,会出现不可预料的结果.比如以下场景:当小伙伴a在往火锅里面添加鱼丸的时候,小伙伴b在同时吃掉鱼丸,这很有可能导致刚下锅的鱼丸被夹出来了(没有熟),或者还没下锅,就去夹鱼丸(夹不到). # coding=utf-

等待与唤醒机制(线程之间的通信)

线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 为什么要处理线程间通信 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们 希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据. 如何保证线程间通信有效利用资源: 多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作. 就是多个线程在操作同一份数据时, 避免对同一共享变量的

java之等待唤醒机制(线程之间的通信)

线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题. 为什么要处理线程间通信: 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据. 如何保证线程间通信有效利

Python35 events(事件)、队列

事件(events) 基于event实现绿灯举例的多线程 程序 def lighter(): count = 0 event.set() ##先设置标志位为真,表示初始状态就是绿灯.否则当下面的if count > 5之前,标志位都是没有被设置的 while True: if count > 5 and count <10: #大于5并且小于10就改成红灯 # 这里代码不能只写成if count > 5,因为只要满足大于5,就不会去匹配大于10的elif条件了. event.cle

对kotlin和java中的synchronized的浅谈

synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12345678910111213 public class { public void () { for (int i = 0; i < 10; i ++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStac

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

线程高级

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜. 示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起.放下两个方法:当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子. 代码示例:  接着设计哲学家类,

linux服务器开发二(系统编程)--线程相关

线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共享). 进程与线程的区别:在于是否共享地址空间. 独居(进程). 合租(线程). Linux下: 线程:最小的执行单位. 进程:最小分配资源单位,可看成是一个线程的进程. 安装man文档 sudo apt-get install glibc-doc sudo apt-get install manp