C#中一道关于多线程的编程题

题目的意思是这样的:让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”,就这样。我是一名QA,不是开发,出于兴趣报考了公司的C#课程考试,多线程那些知识我也认真听过课,但是总归没有机会实际运用过,所以一到真正要动手写的时候也就基本等于不会了,最后我想了半天写了这样的一个程序,我感觉也算是符合了题的要求,还望各路大神不吝赐教,我好学习。也多帮我想想办法,应该怎么学习C#,包括反射,匿名方法和Lambda,委托,多线程,数据验证,等等这些知识的实际应用,给我出一些例题,谢谢啦!十分感谢。

以下是我的程序:

  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.Diagnostics;
  8 using System.IO;
  9 
 10 namespace BLevelProgram
 11 {
 12     class BLevelProgram
 13     {
 14         public BLevelProgram()
 15         {
 16             //Constructor
 17         }
 18 
 19         //静态标识符——记录写入次数.
 20         static int i = 0;
 21         static int o = 0;
 22         //权利标识符——判断线程是否具有写入权利,默认为true,true为线程1的写入权利,false为线程2的写入权利.
 23         static bool flag = true;
 24 
 25         public static void Main()
 26         {
 27             //创建文件夹路径.
 28             Directory.CreateDirectory(@"C:\tylan");
 29             Thread.Sleep(5000);
 30             //创建输出文件并关闭.
 31             File.Create(@"C:\tylan\File.txt").Close();
 32             //后台线程a,b轮流向文件交替写入数据.
 33             Thread a = new Thread(kick1);
 34             a.IsBackground = true;
 35             Thread b = new Thread(kick2);
 36             b.IsBackground = true;
 37             a.Start();
 38             b.Start();
 39             //让主线程等待后台线程.
 40             Thread.Sleep(1000000);
 41             Console.ReadLine();
 42         }
 43 
 44         //向文件中写入当前thread的ID.
 45         public static void kick1()
 46         {
 47             for (int c = 1; c <= 12; c++)
 48             {
 49                 //判断线程是否具有写入权利.
 50                 while (flag == false)
 51                 {
 52                     //没有权利的时候就继续等待.
 53                     Thread.Sleep(1000);
 54                 }
 55                 //小于10次写入则继续写入.
 56                 if (i < 10)
 57                 {
 58                     //输出采取追加模式.
 59                     StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true);
 60                     //写一行到文件中.
 61                     file.WriteLine(Thread.CurrentThread.ManagedThreadId);
 62                     //控制台显示结果.
 63                     Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
 64                     //关闭文件.
 65                     file.Close();
 66                     //线程a写入次数加一.
 67                     i++;
 68                     //把写入权利交给线程b.
 69                     flag = false;
 70                 }
 71                 //等于10次就回调.
 72                 else
 73                 {
 74                     //执行线程回调函数.
 75                     ThreadCallBack();
 76                 }
 77             }
 78         }
 79 
 80         //向文件中写入当前thread的ID.
 81         public static void kick2()
 82         {
 83             for (int c = 1; c <= 12; c++)
 84             {
 85                 //判断线程是否具有写入权利
 86                 while (flag == true)
 87                 {
 88                     //没有权利的时候就继续等待.
 89                     Thread.Sleep(1000);
 90                 }
 91                 //小于10次写入则继续写入.
 92                 if (o < 10)
 93                 {
 94                     //输出采取追加模式.
 95                     StreamWriter file = new StreamWriter(@"C:\tylan\File.txt", true);
 96                     //写一行到文件中.
 97                     file.WriteLine(Thread.CurrentThread.ManagedThreadId);
 98                     //控制台显示结果.
 99                     Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
100                     //关闭文件.
101                     file.Close();
102                     //线程b的写入次数加一.
103                     o++;
104                     //把写入权利交给线程a.
105                     flag = true;
106                 }
107                 //等于10次就回调.
108                 else
109                 {
110                     //执行线程回调函数.
111                     ThreadCallBack();
112                 }             
113             }
114         }
115 
116         //线程回调函数
117         public static void ThreadCallBack()
118         {
119             //在函数中输出"I'm OK.".
120             Console.WriteLine("I'm OK.");
121         }
122     }
123 }

 执行后的结果在控制台输出是:

文件中的输出结果为:

posted @ 2015-04-16 13:55  天外归云  阅读(447)  评论(0编辑  收藏  举报