C#中一道关于多线程的编程题
2015-04-16 13:55
459 查看
题目的意思是这样的:让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”,就这样。我是一名QA,不是开发,出于兴趣报考了公司的C#课程考试,多线程那些知识我也认真听过课,但是总归没有机会实际运用过,所以一到真正要动手写的时候也就基本等于不会了,最后我想了半天写了这样的一个程序,我感觉也算是符合了题的要求,还望各路大神不吝赐教,我好学习。也多帮我想想办法,应该怎么学习C#,包括反射,匿名方法和Lambda,委托,多线程,数据验证,等等这些知识的实际应用,给我出一些例题,谢谢啦!十分感谢。
以下是我的程序:
执行后的结果在控制台输出是:
文件中的输出结果为:
以下是我的程序:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Diagnostics; using System.IO; namespace BLevelProgram { class BLevelProgram { public BLevelProgram() { //Constructor } //静态标识符——记录写入次数. static int i = 0; static int o = 0; //权利标识符——判断线程是否具有写入权利,默认为true,true为线程1的写入权利,false为线程2的写入权利. static bool flag = true; public static void Main() { //创建文件夹路径. Directory.CreateDirectory(@"C:\tylan"); Thread.Sleep(5000); //创建输出文件并关闭. File.Create(@"C:\tylan\File.txt").Close(); //后台线程a,b轮流向文件交替写入数据. Thread a = new Thread(kick1); a.IsBackground = true; Thread b = new Thread(kick2); b.IsBackground = true; a.Start(); b.Start(); //让主线程等待后台线程. Thread.Sleep(1000000); Console.ReadLine(); } //向文件中写入当前thread的ID. public static void kick1() { for (int c = 1; c <= 12; c++) { //判断线程是否具有写入权利. while (flag == false) { //没有权利的时候就继续等待. Thread.Sleep(1000); } //小于10次写入则继续写入. if (i < 10) { //输出采取追加模式. StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true); //写一行到文件中. file.WriteLine(Thread.CurrentThread.ManagedThreadId); //控制台显示结果. Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //关闭文件. file.Close(); //线程a写入次数加一. i++; //把写入权利交给线程b. flag = false; } //等于10次就回调. else { //执行线程回调函数. ThreadCallBack(); } } } //向文件中写入当前thread的ID. public static void kick2() { for (int c = 1; c <= 12; c++) { //判断线程是否具有写入权利 while (flag == true) { //没有权利的时候就继续等待. Thread.Sleep(1000); } //小于10次写入则继续写入. if (o < 10) { //输出采取追加模式. StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true); //写一行到文件中. file.WriteLine(Thread.CurrentThread.ManagedThreadId); //控制台显示结果. Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //关闭文件. file.Close(); //线程b的写入次数加一. o++; //把写入权利交给线程a. flag = true; } //等于10次就回调. else { //执行线程回调函数. ThreadCallBack(); } } } //线程回调函数 public static void ThreadCallBack() { //在函数中输出"I'm OK.". Console.WriteLine("I'm OK."); } } }
执行后的结果在控制台输出是:
文件中的输出结果为:
相关文章推荐
- C#中关于多线程编程的示例代码
- 关于C#多线程、网络编程与计时器Timer的一点使用心得
- 【面向对象语言系列】关于 C# 多线程编程,你需要知道的事
- C#中一道关于多线程的基础练习题——模拟仓库存销过程
- 关于多线程编程的一点思考
- 关于一道面试题,使用C#实现字符串反转算法
- 关于多线程编程
- 关于c#和matlab联合编程
- C#网络编程(二)------多线程socket实例
- 关于C#里面socket编程的一点理解
- (转载)C# Socket多线程编程实例
- c# 多线程 编程
- C#中Socket多线程编程实例 (转)
- 关于一道C#上机题的一点想法
- 关于多线程编程您不知道的 5 件事 有关高性能线程处理的微妙之处
- C#中关于多线程的问题
- 关于C#多屏幕显示器编程
- 智力拼图问题–关于回溯和并行:单线到多线程再到GPU编程的进阶(一)
- 关于在C#中实现AOP 拦截编程模式的新的探索
- C#网络编程之单线程与多线程实例对比(3)