C#中一道关于多线程的基础练习题——模拟仓库存销过程

简介:

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

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

评分标准:

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

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

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

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

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

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

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading.Tasks; 
  6. using System.Threading; 
  7. using System.IO; 
  8.  
  9. namespace MultiThreadStore 
  10.     class Program 
  11.     { 
  12.         //入口 
  13.         static void Main(string[] args) 
  14.         { 
  15.             Goods goods = new Goods(); 
  16.             Thread storeGoods = new Thread(new ParameterizedThreadStart(store)); 
  17.             Thread sellGoods = new Thread(new ParameterizedThreadStart(sell)); 
  18.             storeGoods.Start(goods); 
  19.             sellGoods.Start(goods); 
  20.             Console.ReadLine(); 
  21.         } 
  22.         //存货方法 
  23.         private static void store(object obj) 
  24.         { 
  25.             bool storeFlag = true
  26.             Random random = new Random(); 
  27.             while (storeFlag) 
  28.             { 
  29.                 try 
  30.                 { 
  31.                     Goods goods = obj as Goods; 
  32.                     if (goods.Num < goods.MaxNum) 
  33.                     { 
  34.                         goods.Num++; 
  35.                         Console.WriteLine("Store a goods, " + goods.Num + " goods left!"); 
  36.                     } 
  37.                     else  
  38.                     { 
  39.                         Console.WriteLine("The store is full now."); 
  40.                     } 
  41.                     Thread.Sleep(random.Next(500, 1000)); 
  42.                 } 
  43.                 catch (Exception ex) 
  44.                 { 
  45.                     WriteLog(ex); 
  46.                     storeFlag = false
  47.                 } 
  48.             } 
  49.         } 
  50.         //卖货方法 
  51.         public static void sell(object obj)  
  52.         { 
  53.             bool sellFlag = true
  54.             Random random = new Random(); 
  55.             while (sellFlag) 
  56.             { 
  57.                 try 
  58.                 { 
  59.                     Goods goods = obj as Goods; 
  60.                     if (goods.Num > 0) 
  61.                     { 
  62.                         goods.Num--; 
  63.                         Console.WriteLine("Sell a goods, " + goods.Num + " goods left!"); 
  64.                     } 
  65.                     else  
  66.                     { 
  67.                         Console.WriteLine("There are no goods now."); 
  68.                     } 
  69.                     Thread.Sleep(random.Next(1000, 4000)); 
  70.                 } 
  71.                 catch (Exception ex) 
  72.                 { 
  73.                     WriteLog(ex); 
  74.                     sellFlag = false
  75.                 } 
  76.             } 
  77.         } 
  78.         //打log方法 
  79.         private static void WriteLog(Exception ex) 
  80.         { 
  81.             string logUrl = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\MuliThreadStorelog.txt"
  82.             if (File.Exists(@logUrl)) 
  83.             { 
  84.                 using (FileStream fs = new FileStream(logUrl, FileMode.Append)) 
  85.                 { 
  86.                     using (StreamWriter sw = new StreamWriter(fs, Encoding.Default)) 
  87.                     { 
  88.                         try 
  89.                         { 
  90.                             sw.Write(ex); 
  91.                         } 
  92.                         catch (Exception ex1) 
  93.                         { 
  94.                             WriteLog(ex1); 
  95.                         } 
  96.                         finally 
  97.                         { 
  98.                             sw.Close(); 
  99.                             fs.Close(); 
  100.                         } 
  101.                     } 
  102.                 } 
  103.             } 
  104.             else 
  105.             { 
  106.                 using (FileStream fs = new FileStream(logUrl, FileMode.CreateNew)) 
  107.                 { 
  108.                     using (StreamWriter sw = new StreamWriter(fs, Encoding.Default)) 
  109.                     { 
  110.                         try 
  111.                         { 
  112.                             sw.Write(ex); 
  113.                         } 
  114.                         catch (Exception ex1) 
  115.                         { 
  116.                             WriteLog(ex1); 
  117.                         } 
  118.                         finally 
  119.                         { 
  120.                             sw.Close(); 
  121.                             fs.Close(); 
  122.                         } 
  123.                     } 
  124.                 } 
  125.             } 
  126.         } 
  127.     } 
  128.     //货品类 
  129.     class Goods  
  130.     { 
  131.         public int Num { getset; } 
  132.         public int MaxNum { getset; } 
  133.         public Goods()  
  134.         { 
  135.             Num = 10; 
  136.             MaxNum = 50; 
  137.         }      
  138.     } 
运行截图:



作者:天外归云

来源:51CTO

相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
1月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
1月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
1月前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
|
1月前
|
Java C#
C#学习相关系列之多线程(六)----Task的初级使用
C#学习相关系列之多线程(六)----Task的初级使用
|
1月前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
1月前
|
C# Windows
c#学习系列相关之多线程(三)----invoke和begininvoke
c#学习系列相关之多线程(三)----invoke和begininvoke