zoukankan      html  css  js  c++  java
  • 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:	ylan");
     29             Thread.Sleep(5000);
     30             //创建输出文件并关闭.
     31             File.Create(@"C:	ylanFile.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:	ylanFile.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:	ylanFile.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 }

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

    文件中的输出结果为:

  • 相关阅读:
    MS SQL Server迁移至Azure SQL
    Aras Innovator 11 sp2 firefox客户端设置
    Aras Innovator 11 sp2 IE客户端设置
    Aras Innovator 11 sp2安装
    JDK Windows安装
    mocha测试es6问题
    jQuery中animate与scrollTop、offset().top实例
    AI下载步骤
    Visual Studio Code必备插件
    Visual Studio code快捷键
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/4431920.html
Copyright © 2011-2022 走看看