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 }
执行后的结果在控制台输出是:

文件中的输出结果为:



浙公网安备 33010602011771号