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(, ));
- }
- 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 > )
- {
- goods.Num--;
- Console.WriteLine("Sell a goods, " + goods.Num + " goods left!");
- }
- else
- {
- Console.WriteLine("There are no goods now.");
- }
- Thread.Sleep(random.Next(, ));
- }
- 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 = ;
- MaxNum = ;
- }
- }
- }
运行截图:
C#中一道关于多线程的基础练习题——模拟仓库存销过程的更多相关文章
- C#中一道关于线程同步的练习题——模拟多窗口售票
题目:模拟窗口卖票,四个窗口同时对外开放售票,需要按顺序售出. 要求:输出每一张票的售出时间和售出窗口,不能出现票未售出或者被售出多次的情况. using System; using System.C ...
- C#中一道关于多线程的编程题
题目的意思是这样的:让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”,就这样.我是一名QA,不是开发,出于兴趣报考了公司的C#课程考试,多线程 ...
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
- C#多线程之基础篇2
在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...
- C#多线程之基础篇1
在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- 深入解析PHP中的(伪)多线程与多进程
本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...
随机推荐
- 恭喜您成为2014年度Microsoft MVP!
- 细说HTML元素的隐藏和显示
CSS文档对HTML的显示和隐藏有2个属性可供选择: 1.display 2.visiblity 这2个有什么区别呢? display: display版本:CSS1/CSS2 兼容性:IE4+ NS ...
- 别人的spring学习入门笔记
http://elf8848.iteye.com/blog/875830 可以做入门参考,英语好可以阅读spring的spring-framework-reference 更多学习blog http ...
- mysql 设置密码
法一: 格式:mysqladmin -u用户名 -p旧密码 password 新密码 方法二:1.用root 进入mysql后mysql>set password =password('你的密码 ...
- apache并发测试工具ab为什么测不准
apache并发测试工具ab为什么测不准 发表于2年前(2013-03-21 12:13) 阅读(1146) | 评论(1) 1人收藏此文章, 我要收藏 赞0 3月21日 深圳 OSC 源创会正在 ...
- 很轻很强大:轻量级桌面环境比较(转自linuxeden)
这天你终于下定决心购买了一台流行的 Netbook ,与往常装机一样,直接安装心爱的 Linux 发行版.好不容易安装完成了,却发现平日启动飞快的应用程序在 Netbook 上怎么都跑不快.怎么办呢? ...
- cxGrid显示行号
定义一个类: TMyCxGrid = class(TObject) class procedure DrawIndicatorCell( Sender: TcxGridTableView; ACanv ...
- 【LeetCode】13. Roman to Integer (2 solutions)
Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...
- 【C++】const成员函数
形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...
- android通过USB使用真机调试程序
我的机子很老,开启个android模拟器都要好几分钟,但幸亏有个android的真机,这样直接在andriod手机上调试也是一个不错的选择.下面我就介绍 一下使用android手机来调试android ...