您的位置:首页 > 编程语言 > C#

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.");
}
}
}


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



文件中的输出结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: