zoukankan      html  css  js  c++  java
  • C#中一道关于多线程的基础练习题——模拟仓库存销过程

    题目:模拟生产、入库、销售(50分)

     假设某企业自产、自存、自销,需要将工厂生产的各类产品不定时的运到仓库,与此同时,需要将仓库中的货物运往超市和商场中进行销售,请编写一个程序模拟此过程(主要是存取这个过程)。

    评分标准:

    1. 仓库的存量是固定的,可以假设为一个常量,比如10。(5分)

    2. 仓库满的时候,不能再向仓库中存货。(10分)

    3. 仓库空的时候,不能卖出货物。(10分)

    4. 存货和取货是同时进行的,不要出现先存满再取完货再存满再取完的效果或者存一个取一个再存再取这样的效果。(15分)

    5. 思路清晰,输出工整,编码规范,有正确的异常处理。(10分)

    用多线程模拟仓库存储和销售的过程代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    using System.IO;
    
    namespace MultiThreadStore
    {
        class Program
        {
            //入口
            static void Main(string[] args)
            {
                Goods goods = new Goods();
                Thread storeGoods = new Thread(new ParameterizedThreadStart(store));
                Thread sellGoods = new Thread(new ParameterizedThreadStart(sell));
                storeGoods.Start(goods);
                sellGoods.Start(goods);
                Console.ReadLine();
            }
            //存货方法
            private static void store(object obj)
            {
                bool storeFlag = true;
                Random random = new Random();
                while (storeFlag)
                {
                    try
                    {
                        Goods goods = obj as Goods;
                        if (goods.Num < goods.MaxNum)
                        {
                            goods.Num++;
                            Console.WriteLine("Store a goods, " + goods.Num + " goods left!");
                        }
                        else 
                        {
                            Console.WriteLine("The store is full now.");
                        }
                        Thread.Sleep(random.Next(500, 1000));
                    }
                    catch (Exception ex)
                    {
                        WriteLog(ex);
                        storeFlag = false;
                    }
                }
            }
            //卖货方法
            public static void sell(object obj) 
            {
                bool sellFlag = true;
                Random random = new Random();
                while (sellFlag)
                {
                    try
                    {
                        Goods goods = obj as Goods;
                        if (goods.Num > 0)
                        {
                            goods.Num--;
                            Console.WriteLine("Sell a goods, " + goods.Num + " goods left!");
                        }
                        else 
                        {
                            Console.WriteLine("There are no goods now.");
                        }
                        Thread.Sleep(random.Next(1000, 4000));
                    }
                    catch (Exception ex)
                    {
                        WriteLog(ex);
                        sellFlag = false;
                    }
                }
            }
            //打log方法
            private static void WriteLog(Exception ex)
            {
                string logUrl = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\MuliThreadStorelog.txt";
                if (File.Exists(@logUrl))
                {
                    using (FileStream fs = new FileStream(logUrl, FileMode.Append))
                    {
                        using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                        {
                            try
                            {
                                sw.Write(ex);
                            }
                            catch (Exception ex1)
                            {
                                WriteLog(ex1);
                            }
                            finally
                            {
                                sw.Close();
                                fs.Close();
                            }
                        }
                    }
                }
                else
                {
                    using (FileStream fs = new FileStream(logUrl, FileMode.CreateNew))
                    {
                        using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                        {
                            try
                            {
                                sw.Write(ex);
                            }
                            catch (Exception ex1)
                            {
                                WriteLog(ex1);
                            }
                            finally
                            {
                                sw.Close();
                                fs.Close();
                            }
                        }
                    }
                }
            }
        }
        //货品类
        class Goods 
        {
            public int Num { get; set; }
            public int MaxNum { get; set; }
            public Goods() 
            {
                Num = 10;
                MaxNum = 50;
            }     
        }
    }

    运行截图:

  • 相关阅读:
    bzoj2751
    bzoj1483
    bzoj1011
    bzoj1412
    bzoj1820
    bzoj1295
    bzoj3444
    Java--Exchanger用于进行线程间的数据交换
    Java--Semaphore控制并发线程数量
    Java--Spring AOP 源码散点记录(最后整理成一篇博客)
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/4573543.html
Copyright © 2011-2022 走看看